/* Part of CRC-32C library: https://crc32c.machinezoo.com/ */
/*
  Copyright (c) 2013 - 2014, 2016 Mark Adler, Robert Vazan, Max Vysokikh

  This software is provided 'as-is', without any express or implied
  warranty.  In no event will the author be held liable for any damages
  arising from the use of this software.

  Permission is granted to anyone to use this software for any purpose,
  including commercial applications, and to alter it and redistribute it
  freely, subject to the following restrictions:

  1. The origin of this software must not be misrepresented; you must not
  claim that you wrote the original software. If you use this software
  in a product, an acknowledgment in the product documentation would be
  appreciated but is not required.
  2. Altered source versions must be plainly marked as such, and must not be
  misrepresented as being the original software.
  3. This notice may not be removed or altered from any source distribution.
*/

#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif

#include "crc32c.h"

// ALTERED SOURCE VERSION
//
// Per #2 in the copyright notice above:
// 
// The definition of 'NONMINMAX' below was altered from the original.
// cpuid.h and x86intrin.h are only included if we're on x86 or x64, fixing arm builds.

//#define NOMINMAX

#ifdef CRC32C_GCC
#if defined(__x86_64__) || defined(__i386__)
#include <cpuid.h>
#include <x86intrin.h>
#endif
#else
#include <intrin.h>
#endif

#define POLY 0x82f63b78
#define LONG_SHIFT 8192
#define SHORT_SHIFT 256

typedef const uint8_t *buffer;

static union {
    uint32_t dword_table[16][256];
    uint64_t qword_array[2048];
} table = {
    .qword_array = {
        0xf26b830300000000, 0x1350f3f4e13b70f7, 0x35f1141cc79a971f, 0xd4ca64eb26a1e7e8,
        0x78b2dbcc8ad958cf, 0x9989ab3b6be22838, 0xbf284cd34d43cfd0, 0x5e133c24ac78bf27,
        0xe235446c105ec76f, 0x30e349bf165b798, 0x25afd373d7c45070, 0xc494a38436ff2087,
        0x68ec1ca39a879fa0, 0x89d76c547bbcef57, 0xaf768bbc5d1d08bf, 0x4e4dfb4bbc267848,
        0xd2d60ddd20bd8ede, 0x33ed7d2ac186fe29, 0x154c9ac2e72719c1, 0xf477ea35061c6936,
        0x580f5512aa64d611, 0xb93425e54b5fa6e6, 0x9f95c20d6dfe410e, 0x7eaeb2fa8cc531f9,
        0xc288cab230e349b1, 0x23b3ba45d1d83946, 0x5125dadf779deae, 0xe4292d5a1642ae59,
        0x4851927dba3a117e, 0xa96ae28a5b016189, 0x8fcb05627da08661, 0x6ef075959c9bf696,
        0xb3109ebf417b1dbc, 0x522bee48a0406d4b, 0x748a09a086e18aa3, 0x95b1795767dafa54,
        0x39c9c670cba24573, 0xd8f2b6872a993584, 0xfe53516f0c38d26c, 0x1f682198ed03a29b,
        0xa34e59d05125dad3, 0x42752927b01eaa24, 0x64d4cecf96bf4dcc, 0x85efbe3877843d3b,
        0x2997011fdbfc821c, 0xc8ac71e83ac7f2eb, 0xee0d96001c661503, 0xf36e6f7fd5d65f4,
        0x93ad106161c69362, 0x7296609680fde395, 0x5437877ea65c047d, 0xb50cf7894767748a,
        0x197448aeeb1fcbad, 0xf84f38590a24bb5a, 0xdeeedfb12c855cb2, 0x3fd5af46cdbe2c45,
        0x83f3d70e7198540d, 0x62c8a7f990a324fa, 0x44694011b602c312, 0xa55230e65739b3e5,
        0x92a8fc1fb410cc2, 0xe811ff361a7a7c35, 0xceb018de3cdb9bdd, 0x2f8b6829dde0eb2a,
        0x709db87b82f63b78, 0x91a6c88c63cd4b8f, 0xb7072f64456cac67, 0x563c5f93a457dc90,
        0xfa44e0b4082f63b7, 0x1b7f9043e9141340, 0x3dde77abcfb5f4a8, 0xdce5075c2e8e845f,
        0x60c37f1492a8fc17, 0x81f80fe373938ce0, 0xa759e80b55326b08, 0x466298fcb4091bff,
        0xea1a27db1871a4d8, 0xb21572cf94ad42f, 0x2d80b0c4dfeb33c7, 0xccbbc0333ed04330,
        0x502036a5a24bb5a6, 0xb11b46524370c551, 0x97baa1ba65d122b9, 0x7681d14d84ea524e,
        0xdaf96e6a2892ed69, 0x3bc21e9dc9a99d9e, 0x1d63f975ef087a76, 0xfc5889820e330a81,
        0x407ef1cab21572c9, 0xa145813d532e023e, 0x87e466d5758fe5d6, 0x66df162294b49521,
        0xcaa7a90538cc2a06, 0x2b9cd9f2d9f75af1, 0xd3d3e1aff56bd19, 0xec064eed1e6dcdee,
        0x31e6a5c7c38d26c4, 0xd0ddd53022b65633, 0xf67c32d80417b1db, 0x1747422fe52cc12c,
        0xbb3ffd0849547e0b, 0x5a048dffa86f0efc, 0x7ca56a178ecee914, 0x9d9e1ae06ff599e3,
        0x21b862a8d3d3e1ab, 0xc083125f32e8915c, 0xe622f5b7144976b4, 0x7198540f5720643,
        0xab613a67590ab964, 0x4a5a4a90b831c993, 0x6cfbad789e902e7b, 0x8dc0dd8f7fab5e8c,
        0x115b2b19e330a81a, 0xf0605bee020bd8ed, 0xd6c1bc0624aa3f05, 0x37faccf1c5914ff2,
        0x9b8273d669e9f0d5, 0x7ab9032188d28022, 0x5c18e4c9ae7367ca, 0xbd23943e4f48173d,
        0x105ec76f36e6f75, 0xe03e9c8112551f82, 0xc69f7b6934f4f86a, 0x27a40b9ed5cf889d,
        0x8bdcb4b979b737ba, 0x6ae7c44e988c474d, 0x4c4623a6be2da0a5, 0xad7d53515f16d052,
        0x13a2987700000000, 0x34e7a899274530ee, 0x5d28f9ab4e8a61dc, 0x7a6dc94569cf5132,
        0x8eb65bcf9d14c3b8, 0xa9f36b21ba51f356, 0xc03c3a13d39ea264, 0xe7790afdf4db928a,
        0x2c6769f63fc5f181, 0xb2259181880c16f, 0x62ed082a714f905d, 0x45a838c4560aa0b3,
        0xb173aa4ea2d13239, 0x96369aa0859402d7, 0xfff9cb92ec5b53e5, 0xd8bcfb7ccb1e630b,
        0x6c297b757f8be302, 0x4b6c4b9b58ced3ec, 0x22a31aa9310182de, 0x5e62a471644b230,
        0xf13db8cde29f20ba, 0xd6788823c5da1054, 0xbfb7d911ac154166, 0x98f2e9ff8b507188,
        0x53ec8af4404e1283, 0x74a9ba1a670b226d, 0x1d66eb280ec4735f, 0x3a23dbc6298143b1,
        0xcef8494cdd5ad13b, 0xe9bd79a2fa1fe1d5, 0x8072289093d0b0e7, 0xa737187eb4958009,
        0xecb55e73ff17c604, 0xcbf06e9dd852f6ea, 0xa23f3fafb19da7d8, 0x857a0f4196d89736,
        0x71a19dcb620305bc, 0x56e4ad2545463552, 0x3f2bfc172c896460, 0x186eccf90bcc548e,
        0xd370aff2c0d23785, 0xf4359f1ce797076b, 0x9dface2e8e585659, 0xbabffec0a91d66b7,
        0x4e646c4a5dc6f43d, 0x69215ca47a83c4d3, 0xee0d96134c95e1, 0x27ab3d783409a50f,
        0x933ebd71809c2506, 0xb47b8d9fa7d915e8, 0xddb4dcadce1644da, 0xfaf1ec43e9537434,
        0xe2a7ec91d88e6be, 0x296f4e273acdd650, 0x40a01f1553028762, 0x67e52ffb7447b78c,
        0xacfb4cf0bf59d487, 0x8bbe7c1e981ce469, 0xe2712d2cf1d3b55b, 0xc5341dc2d69685b5,
        0x31ef8f48224d173f, 0x16aabfa6050827d1, 0x7f65ee946cc776e3, 0x5820de7a4b82460d,
        0xe861628efbc3faf9, 0xcf245260dc86ca17, 0xa6eb0352b5499b25, 0x81ae33bc920cabcb,
        0x7575a13666d73941, 0x523091d8419209af, 0x3bffc0ea285d589d, 0x1cbaf0040f186873,
        0xd7a4930fc4060b78, 0xf0e1a3e1e3433b96, 0x992ef2d38a8c6aa4, 0xbe6bc23dadc95a4a,
        0x4ab050b75912c8c0, 0x6df560597e57f82e, 0x43a316b1798a91c, 0x237f018530dd99f2,
        0x97ea818c844819fb, 0xb0afb162a30d2915, 0xd960e050cac27827, 0xfe25d0beed8748c9,
        0xafe4234195cda43, 0x2dbb72da3e19eaad, 0x447423e857d6bb9f, 0x6331130670938b71,
        0xa82f700dbb8de87a, 0x8f6a40e39cc8d894, 0xe6a511d1f50789a6, 0xc1e0213fd242b948,
        0x353bb3b526992bc2, 0x127e835b01dc1b2c, 0x7bb1d26968134a1e, 0x5cf4e2874f567af0,
        0x1776a48a04d43cfd, 0x3033946423910c13, 0x59fcc5564a5e5d21, 0x7eb9f5b86d1b6dcf,
        0x8a62673299c0ff45, 0xad2757dcbe85cfab, 0xc4e806eed74a9e99, 0xe3ad3600f00fae77,
        0x28b3550b3b11cd7c, 0xff665e51c54fd92, 0x663934d7759baca0, 0x417c043952de9c4e,
        0xb5a796b3a6050ec4, 0x92e2a65d81403e2a, 0xfb2df76fe88f6f18, 0xdc68c781cfca5ff6,
        0x68fd47887b5fdfff, 0x4fb877665c1aef11, 0x2677265435d5be23, 0x13216ba12908ecd,
        0xf5e98430e64b1c47, 0xd2acb4dec10e2ca9, 0xbb63e5eca8c17d9b, 0x9c26d5028f844d75,
        0x5738b609449a2e7e, 0x707d86e763df1e90, 0x19b2d7d50a104fa2, 0x3ef7e73b2d557f4c,
        0xca2c75b1d98eedc6, 0xed69455ffecbdd28, 0x84a6146d97048c1a, 0xa3e32483b041bcf4,
        0xa541927e00000000, 0xea2ec0734f6f520d, 0x3b9f36649edea41a, 0x74f06469d1b1f617,
        0x9d10acbb38513ec5, 0xd27ffeb6773e6cc8, 0x3ce08a1a68f9adf, 0x4ca15aace9e0c8d2,
        0xd5e3eff470a27d8a, 0x9a8cbdf93fcd2f87, 0x4b3d4beeee7cd990, 0x45219e3a1138b9d,
        0xedb2d13148f3434f, 0xa2dd833c079c1142, 0x736c752bd62de755, 0x3c0327269942b558,
        0x4405696ae144fb14, 0xb6a3b67ae2ba919, 0xdadbcd707f9a5f0e, 0x95b49f7d30f50d03,
        0x7c5457afd915c5d1, 0x333b05a2967a97dc, 0xe28af3b547cb61cb, 0xade5a1b808a433c6,
        0x34a714e091e6869e, 0x7bc846edde89d493, 0xaa79b0fa0f382284, 0xe516e2f740577089,
        0xcf62a25a9b7b85b, 0x43997828e6d8ea56, 0x92288e3f37691c41, 0xdd47dc3278064e4c,
        0x622412a7c76580d9, 0x2d4b40aa880ad2d4, 0xfcfab6bd59bb24c3, 0xb395e4b016d476ce,
        0x5a752c62ff34be1c, 0x151a7e6fb05bec11, 0xc4ab887861ea1a06, 0x8bc4da752e85480b,
        0x12866f2db7c7fd53, 0x5de93d20f8a8af5e, 0x8c58cb3729195949, 0xc337993a66760b44,
        0x2ad751e88f96c396, 0x65b803e5c0f9919b, 0xb409f5f21148678c, 0xfb66a7ff5e273581,
        0x8360e9b326217bcd, 0xcc0fbbbe694e29c0, 0x1dbe4da9b8ffdfd7, 0x52d11fa4f7908dda,
        0xbb31d7761e704508, 0xf45e857b511f1705, 0x25ef736c80aee112, 0x6a802161cfc1b31f,
        0xf3c2943956830647, 0xbcadc63419ec544a, 0x6d1c3023c85da25d, 0x2273622e8732f050,
        0xcb93aafc6ed23882, 0x84fcf8f121bd6a8f, 0x554d0ee6f00c9c98, 0x1a225cebbf63ce95,
        0x2e66e53d8b277743, 0x6109b730c448254e, 0xb0b8412715f9d359, 0xffd7132a5a968154,
        0x1637dbf8b3764986, 0x595889f5fc191b8b, 0x88e97fe22da8ed9c, 0xc7862def62c7bf91,
        0x5ec498b7fb850ac9, 0x11abcabab4ea58c4, 0xc01a3cad655baed3, 0x8f756ea02a34fcde,
        0x6695a672c3d4340c, 0x29faf47f8cbb6601, 0xf84b02685d0a9016, 0xb72450651265c21b,
        0xcf221e296a638c57, 0x804d4c24250cde5a, 0x51fcba33f4bd284d, 0x1e93e83ebbd27a40,
        0xf77320ec5232b292, 0xb81c72e11d5de09f, 0x69ad84f6ccec1688, 0x26c2d6fb83834485,
        0xbf8063a31ac1f1dd, 0xf0ef31ae55aea3d0, 0x215ec7b9841f55c7, 0x6e3195b4cb7007ca,
        0x87d15d662290cf18, 0xc8be0f6b6dff9d15, 0x190ff97cbc4e6b02, 0x5660ab71f321390f,
        0xe90365e44c42f79a, 0xa66c37e9032da597, 0x77ddc1fed29c5380, 0x38b293f39df3018d,
        0xd1525b217413c95f, 0x9e3d092c3b7c9b52, 0x4f8cff3beacd6d45, 0xe3ad36a5a23f48,
        0x99a1186e3ce08a10, 0xd6ce4a63738fd81d, 0x77fbc74a23e2e0a, 0x4810ee79ed517c07,
        0xa1f026ab04b1b4d5, 0xee9f74a64bdee6d8, 0x3f2e82b19a6f10cf, 0x7041d0bcd50042c2,
        0x8479ef0ad060c8e, 0x4728ccfde2695e83, 0x96993aea33d8a894, 0xd9f668e77cb7fa99,
        0x3016a0359557324b, 0x7f79f238da386046, 0xaec8042f0b899651, 0xe1a7562244e6c45c,
        0x78e5e37adda47104, 0x378ab17792cb2309, 0xe63b4760437ad51e, 0xa954156d0c158713,
        0x40b4ddbfe5f54fc1, 0xfdb8fb2aa9a1dcc, 0xde6a79a57b2bebdb, 0x91052ba83444b9d6,
        0xdd45aab800000000, 0x62228939bf672381, 0xa6679b4b7b2231f3, 0x1900b8cac4451272,
        0x2b01c95ef64463e6, 0x9466eadf49234067, 0x5023f8ad8d665215, 0xef44db2c32017194,
        0x34211b85e964b13d, 0x8b463804560392bc, 0x4f032a76924680ce, 0xf06409f72d21a34f,
        0xc26578631f20d2db, 0x7d025be2a047f15a, 0xb94749906402e328, 0x6206a11db65c0a9,
        0xa60be33d725148b, 0xb5079db26842370a, 0x71428fc0ac072578, 0xce25ac41136006f9,
        0xfc24ddd52161776d, 0x4343fe549e0654ec, 0x8706ec265a43469e, 0x3861cfa7e524651f,
        0xe3040f0e3e41a5b6, 0x5c632c8f81268637, 0x98263efd45639445, 0x27411d7cfa04b7c4,
        0x15406ce8c805c650, 0xaa274f697762e5d1, 0x6e625d1bb327f7a3, 0xd1057e9a0c40d422,
        0x76e3f55faba65fe7, 0xc984d6de14c17c66, 0xdc1c4acd0846e14, 0xb2a6e72d6fe34d95,
        0x80a796b95de23c01, 0x3fc0b538e2851f80, 0xfb85a74a26c00df2, 0x44e284cb99a72e73,
        0x9f87446242c2eeda, 0x20e067e3fda5cd5b, 0xe4a5759139e0df29, 0x5bc256108687fca8,
        0x69c32784b4868d3c, 0xd6a404050be1aebd, 0x12e11677cfa4bccf, 0xad8635f670c39f4e,
        0xa1c6e1d47c834b6c, 0x1ea1c255c3e468ed, 0xdae4d02707a17a9f, 0x6583f3a6b8c6591e,
        0x578282328ac7288a, 0xe8e5a1b335a00b0b, 0x2ca0b3c1f1e51979, 0x93c790404e823af8,
        0x48a250e995e7fa51, 0xf7c573682a80d9d0, 0x3380611aeec5cba2, 0x8ce7429b51a2e823,
        0xbee6330f63a399b7, 0x181108edcc4ba36, 0xc5c402fc1881a844, 0x7aa3217da7e68bc5,
        0x8fe5638752a0c93f, 0x30824006edc7eabe, 0xf4c752742982f8cc, 0x4ba071f596e5db4d,
        0x79a10061a4e4aad9, 0xc6c623e01b838958, 0x2833192dfc69b2a, 0xbde4121360a1b8ab,
        0x6681d2babbc47802, 0xd9e6f13b04a35b83, 0x1da3e349c0e649f1, 0xa2c4c0c87f816a70,
        0x90c5b15c4d801be4, 0x2fa292ddf2e73865, 0xebe780af36a22a17, 0x5480a32e89c50996,
        0x58c0770c8585ddb4, 0xe7a7548d3ae2fe35, 0x23e246fffea7ec47, 0x9c85657e41c0cfc6,
        0xae8414ea73c1be52, 0x11e3376bcca69dd3, 0xd5a6251908e38fa1, 0x6ac10698b784ac20,
        0xb1a4c6316ce16c89, 0xec3e5b0d3864f08, 0xca86f7c217c35d7a, 0x75e1d443a8a47efb,
        0x47e0a5d79aa50f6f, 0xf887865625c22cee, 0x3cc29424e1873e9c, 0x83a5b7a55ee01d1d,
        0x24433c60f90696d8, 0x9b241fe14661b559, 0x5f610d938224a72b, 0xe0062e123d4384aa,
        0xd2075f860f42f53e, 0x6d607c07b025d6bf, 0xa9256e757460c4cd, 0x16424df4cb07e74c,
        0xcd278d5d106227e5, 0x7240aedcaf050464, 0xb605bcae6b401616, 0x9629f2fd4273597,
        0x3b63eebbe6264403, 0x8404cd3a59416782, 0x4041df489d0475f0, 0xff26fcc922635671,
        0xf36628eb2e238253, 0x4c010b6a9144a1d2, 0x884419185501b3a0, 0x37233a99ea669021,
        0x5224b0dd867e1b5, 0xba45688c6700c234, 0x7e007afea345d046, 0xc167597f1c22f3c7,
        0x1a0299d6c747336e, 0xa565ba57782010ef, 0x6120a825bc65029d, 0xde478ba40302211c,
        0xec46fa3031035088, 0x5321d9b18e647309, 0x9764cbc34a21617b, 0x2803e842f54642fa,
        0x38116fac00000000, 0x4833b0f47022df58, 0xd854d11ce045beb0, 0xa8760e44906761e8,
        0xfd76643dc5670b91, 0x8d54bb65b545d4c9, 0x1d33da8d2522b521, 0x6d1105d555006a79,
        0xb7330e7f8f2261d3, 0xc711d127ff00be8b, 0x5776b0cf6f67df63, 0x27546f971f45003b,
        0x725405ee4a456a42, 0x276dab63a67b51a, 0x9211bb5eaa00d4f2, 0xe2336406da220baa,
        0x23b9dafb1ba8b557, 0x539b05a36b8a6a0f, 0xc3fc644bfbed0be7, 0xb3debb138bcfd4bf,
        0xe6ded16adecfbec6, 0x96fc0e32aeed619e, 0x69b6fda3e8a0076, 0x76b9b0824ea8df2e,
        0xac9bbb28948ad484, 0xdcb96470e4a80bdc, 0x4cde059874cf6a34, 0x3cfcdac004edb56c,
        0x69fcb0b951eddf15, 0x19de6fe121cf004d, 0x89b90e09b1a861a5, 0xf99bd151c18abefd,
        0xf40050237516aae, 0x7f62da5a4773b5f6, 0xef05bbb2d714d41e, 0x9f2764eaa7360b46,
        0xca270e93f236613f, 0xba05d1cb8214be67, 0x2a62b0231273df8f, 0x5a406f7b625100d7,
        0x806264d1b8730b7d, 0xf040bb89c851d425, 0x6027da615836b5cd, 0x1005053928146a95,
        0x45056f407d1400ec, 0x3527b0180d36dfb4, 0xa540d1f09d51be5c, 0xd5620ea8ed736104,
        0x14e8b0552cf9dff9, 0x64ca6f0d5cdb00a1, 0xf4ad0ee5ccbc6149, 0x848fd1bdbc9ebe11,
        0xd18fbbc4e99ed468, 0xa1ad649c99bc0b30, 0x31ca057409db6ad8, 0x41e8da2c79f9b580,
        0x9bcad186a3dbbe2a, 0xebe80eded3f96172, 0x7b8f6f36439e009a, 0xbadb06e33bcdfc2,
        0x5eadda1766bcb5bb, 0x2e8f054f169e6ae3, 0xbee864a786f90b0b, 0xcecabbfff6dbd453,
        0x56b3baf06ea2d55c, 0x269165a81e800a04, 0xb6f604408ee76bec, 0xc6d4db18fec5b4b4,
        0x93d4b161abc5decd, 0xe3f66e39dbe70195, 0x73910fd14b80607d, 0x3b3d0893ba2bf25,
        0xd991db23e180b48f, 0xa9b3047b91a26bd7, 0x39d4659301c50a3f, 0x49f6bacb71e7d567,
        0x1cf6d0b224e7bf1e, 0x6cd40fea54c56046, 0xfcb36e02c4a201ae, 0x8c91b15ab480def6,
        0x4d1b0fa7750a600b, 0x3d39d0ff0528bf53, 0xad5eb117954fdebb, 0xdd7c6e4fe56d01e3,
        0x887c0436b06d6b9a, 0xf85edb6ec04fb4c2, 0x6839ba865028d52a, 0x181b65de200a0a72,
        0xc2396e74fa2801d8, 0xb21bb12c8a0ade80, 0x227cd0c41a6dbf68, 0x525e0f9c6a4f6030,
        0x75e65e53f4f0a49, 0x777cbabd4f6dd511, 0xe71bdb55df0ab4f9, 0x9739040daf286ba1,
        0x61e2d05e59f3bff2, 0x11c00f0629d160aa, 0x81a76eeeb9b60142, 0xf185b1b6c994de1a,
        0xa485dbcf9c94b463, 0xd4a70497ecb66b3b, 0x44c0657f7cd10ad3, 0x34e2ba270cf3d58b,
        0xeec0b18dd6d1de21, 0x9ee26ed5a6f30179, 0xe850f3d36946091, 0x7ea7d06546b6bfc9,
        0x2ba7ba1c13b6d5b0, 0x5b85654463940ae8, 0xcbe204acf3f36b00, 0xbbc0dbf483d1b458,
        0x7a4a6509425b0aa5, 0xa68ba513279d5fd, 0x9a0fdbb9a21eb415, 0xea2d04e1d23c6b4d,
        0xbf2d6e98873c0134, 0xcf0fb1c0f71ede6c, 0x5f68d0286779bf84, 0x2f4a0f70175b60dc,
        0xf56804dacd796b76, 0x854adb82bd5bb42e, 0x152dba6a2d3cd5c6, 0x650f65325d1e0a9e,
        0x300f0f4b081e60e7, 0x402dd013783cbfbf, 0xd04ab1fbe85bde57, 0xa0686ea39879010f,
        0xef306b1900000000, 0x34bccbdadb8ca0c3, 0x5dc55c6eb2f53777, 0x8649fcad697997b4,
        0x8f3673066006181f, 0x54bad3c5bb8ab8dc, 0x3dc34471d2f32f68, 0xe64fe4b2097f8fab,
        0x2f3c5b27c00c303e, 0xf4b0fbe41b8090fd, 0x9dc96c5072f90749, 0x4645cc93a975a78a,
        0x4f3a4338a00a2821, 0x94b6e3fb7b8688e2, 0xfdcf744f12ff1f56, 0x2643d48cc973bf95,
        0x6ac47d9485f4168d, 0xb148dd575e78b64e, 0xd8314ae3370121fa, 0x3bdea20ec8d8139,
        0xac2658be5f20e92, 0xd14ec5483e7eae51, 0xb83752fc570739e5, 0x63bbf23f8c8b9926,
        0xaac84daa45f826b3, 0x7144ed699e748670, 0x183d7addf70d11c4, 0xc3b1da1e2c81b107,
        0xcace55b525fe3eac, 0x1142f576fe729e6f, 0x783b62c2970b09db, 0xa3b7c2014c87a918,
        0xe13430f20e045beb, 0x3ab89031d588fb28, 0x53c10785bcf16c9c, 0x884da746677dcc5f,
        0x813228ed6e0243f4, 0x5abe882eb58ee337, 0x33c71f9adcf77483, 0xe84bbf59077bd440,
        0x213800ccce086bd5, 0xfab4a00f1584cb16, 0x93cd37bb7cfd5ca2, 0x48419778a771fc61,
        0x413e18d3ae0e73ca, 0x9ab2b8107582d309, 0xf3cb2fa41cfb44bd, 0x28478f67c777e47e,
        0x64c0267f8bf04d66, 0xbf4c86bc507ceda5, 0xd635110839057a11, 0xdb9b1cbe289dad2,
        0x4c63e60ebf65579, 0xdf4a9ea3307af5ba, 0xb63309175903620e, 0x6dbfa9d4828fc2cd,
        0xa4cc16414bfc7d58, 0x7f40b6829070dd9b, 0x16392136f9094a2f, 0xcdb581f52285eaec,
        0xc4ca0e5e2bfa6547, 0x1f46ae9df076c584, 0x763f3929990f5230, 0xadb399ea4283f2f3,
        0xf338dccf1c08b7d6, 0x28b47c0cc7841715, 0x41cdebb8aefd80a1, 0x9a414b7b75712062,
        0x933ec4d07c0eafc9, 0x48b26413a7820f0a, 0x21cbf3a7cefb98be, 0xfa4753641577387d,
        0x3334ecf1dc0487e8, 0xe8b84c320788272b, 0x81c1db866ef1b09f, 0x5a4d7b45b57d105c,
        0x5332f4eebc029ff7, 0x88be542d678e3f34, 0xe1c7c3990ef7a880, 0x3a4b635ad57b0843,
        0x76ccca4299fca15b, 0xad406a8142700198, 0xc439fd352b09962c, 0x1fb55df6f08536ef,
        0x16cad25df9fab944, 0xcd46729e22761987, 0xa43fe52a4b0f8e33, 0x7fb345e990832ef0,
        0xb6c0fa7c59f09165, 0x6d4c5abf827c31a6, 0x435cd0beb05a612, 0xdfb96dc8308906d1,
        0xd6c6e26339f6897a, 0xd4a42a0e27a29b9, 0x6433d5148b03be0d, 0xbfbf75d7508f1ece,
        0xfd3c8724120cec3d, 0x26b027e7c9804cfe, 0x4fc9b053a0f9db4a, 0x944510907b757b89,
        0x9d3a9f3b720af422, 0x46b63ff8a98654e1, 0x2fcfa84cc0ffc355, 0xf443088f1b736396,
        0x3d30b71ad200dc03, 0xe6bc17d9098c7cc0, 0x8fc5806d60f5eb74, 0x544920aebb794bb7,
        0x5d36af05b206c41c, 0x86ba0fc6698a64df, 0xefc3987200f3f36b, 0x344f38b1db7f53a8,
        0x78c891a997f8fab0, 0xa344316a4c745a73, 0xca3da6de250dcdc7, 0x11b1061dfe816d04,
        0x18ce89b6f7fee2af, 0xc34229752c72426c, 0xaa3bbec1450bd5d8, 0x71b71e029e87751b,
        0xb8c4a19757f4ca8e, 0x634801548c786a4d, 0xa3196e0e501fdf9, 0xd1bd36233e8d5d3a,
        0xd8c2b98837f2d291, 0x34e194bec7e7252, 0x6a378eff8507e5e6, 0xb1bb2e3c5e8b4525,
        0x68032cc800000000, 0xb8057558d0065990, 0xcde3e919a5e0c5d1, 0x1de5b08975e69c41,
        0x262ed19b4e2dfd53, 0xf628880b9e2ba4c3, 0x83ce144aebcd3882, 0x53c84dda3bcb6112,
        0xf458d66e9c5bfaa6, 0x245e8ffe4c5da336, 0x51b813bf39bb3f77, 0x81be4a2fe9bd66e7,
        0xba752b3dd27607f5, 0x6a7372ad02705e65, 0x1f95eeec7796c224, 0xcf93b77ca7909bb4,
        0x5558af753d5b83bd, 0x855ef6e5ed5dda2d, 0xf0b86aa498bb466c, 0x20be333448bd1ffc,
        0x1b75522673767eee, 0xcb730bb6a370277e, 0xbe9597f7d696bb3f, 0x6e93ce670690e2af,
        0xc90355d3a100791b, 0x19050c437106208b, 0x6ce3900204e0bcca, 0xbce5c992d4e6e55a,
        0x872ea880ef2d8448, 0x5728f1103f2bddd8, 0x22ce6d514acd4199, 0xf2c834c19acb1809,
        0x12b42bb27ab7077a, 0xc2b27222aab15eea, 0xb754ee63df57c2ab, 0x6752b7f30f519b3b,
        0x5c99d6e1349afa29, 0x8c9f8f71e49ca3b9, 0xf9791330917a3ff8, 0x297f4aa0417c6668,
        0x8eefd114e6ecfddc, 0x5ee9888436eaa44c, 0x2b0f14c5430c380d, 0xfb094d55930a619d,
        0xc0c22c47a8c1008f, 0x10c475d778c7591f, 0x6522e9960d21c55e, 0xb524b006dd279cce,
        0x2fefa80f47ec84c7, 0xffe9f19f97eadd57, 0x8a0f6ddee20c4116, 0x5a09344e320a1886,
        0x61c2555c09c17994, 0xb1c40cccd9c72004, 0xc422908dac21bc45, 0x1424c91d7c27e5d5,
        0xb3b452a9dbb77e61, 0x63b20b390bb127f1, 0x165497787e57bbb0, 0xc652cee8ae51e220,
        0xfd99affa959a8332, 0x2d9ff66a459cdaa2, 0x58796a2b307a46e3, 0x887f33bbe07c1f73,
        0x9d6d223cf56e0ef4, 0x4d6b7bac25685764, 0x388de7ed508ecb25, 0xe88bbe7d808892b5,
        0xd340df6fbb43f3a7, 0x34686ff6b45aa37, 0x76a01abe1ea33676, 0xa6a6432ecea56fe6,
        0x136d89a6935f452, 0xd130810ab933adc2, 0xa4d61d4bccd53183, 0x74d044db1cd36813,
        0x4f1b25c927180901, 0x9f1d7c59f71e5091, 0xeafbe01882f8ccd0, 0x3afdb98852fe9540,
        0xa036a181c8358d49, 0x7030f8111833d4d9, 0x5d664506dd54898, 0xd5d03dc0bdd31108,
        0xee1b5cd28618701a, 0x3e1d0542561e298a, 0x4bfb990323f8b5cb, 0x9bfdc093f3feec5b,
        0x3c6d5b27546e77ef, 0xec6b02b784682e7f, 0x998d9ef6f18eb23e, 0x498bc7662188ebae,
        0x7240a6741a438abc, 0xa246ffe4ca45d32c, 0xd7a063a5bfa34f6d, 0x7a63a356fa516fd,
        0xe7da25468fd9098e, 0x37dc7cd65fdf501e, 0x423ae0972a39cc5f, 0x923cb907fa3f95cf,
        0xa9f7d815c1f4f4dd, 0x79f1818511f2ad4d, 0xc171dc46414310c, 0xdc114454b412689c,
        0x7b81dfe01382f328, 0xab878670c384aab8, 0xde611a31b66236f9, 0xe6743a166646f69,
        0x35ac22b35daf0e7b, 0xe5aa7b238da957eb, 0x904ce762f84fcbaa, 0x404abef22849923a,
        0xda81a6fbb2828a33, 0xa87ff6b6284d3a3, 0x7f61632a17624fe2, 0xaf673abac7641672,
        0x94ac5ba8fcaf7760, 0x44aa02382ca92ef0, 0x314c9e79594fb2b1, 0xe14ac7e98949eb21,
        0x46da5c5d2ed97095, 0x96dc05cdfedf2905, 0xe33a998c8b39b544, 0x333cc01c5b3fecd4,
        0x8f7a10e60f48dc6, 0xd8f1f89eb0f2d456, 0xad1764dfc5144817, 0x7d113d4f15121187,
        0x493c7d2700000000, 0xdb4487699278fa4e, 0x6821ff4a211d826d, 0xfa590504b3657823,
        0xb0779fd423b04da, 0x997f83b3d043fe94, 0x2a1afb90632686b7, 0xb86201def15e7cf9,
        0xcd4a7493847609b4, 0x5f328edd160ef3fa, 0xec57f6fea56b8bd9, 0x7e2f0cb037137197,
        0x8f717049c64d0d6e, 0x1d098a075435f720, 0xae6cf224e7508f03, 0x3c14086a7528754d,
        0x443c18be0d006599, 0xd644e2f09f789fd7, 0x65219ad32c1de7f4, 0xf759609dbe651dba,
        0x6071c644f3b6143, 0x947fe62add439b0d, 0x271a9e096e26e32e, 0xb5626447fc5e1960,
        0xc04a110a89766c2d, 0x5232eb441b0e9663, 0xe1579367a86bee40, 0x732f69293a13140e,
        0x827115d0cb4d68f7, 0x1009ef9e593592b9, 0xa36c97bdea50ea9a, 0x31146df3782810d4,
        0x533cb6151a00cb32, 0xc1444c5b8878317c, 0x722134783b1d495f, 0xe059ce36a965b311,
        0x1107b2cf583bcfe8, 0x837f4881ca4335a6, 0x301a30a279264d85, 0xa262caeceb5eb7cb,
        0xd74abfa19e76c286, 0x453245ef0c0e38c8, 0xf6573dccbf6b40eb, 0x642fc7822d13baa5,
        0x9571bb7bdc4dc65c, 0x70941354e353c12, 0xb46c3916fd504431, 0x2614c3586f28be7f,
        0x5e3cd38c1700aeab, 0xcc4429c2857854e5, 0x7f2151e1361d2cc6, 0xed59abafa465d688,
        0x1c07d756553baa71, 0x8e7f2d18c743503f, 0x3d1a553b7426281c, 0xaf62af75e65ed252,
        0xda4ada389376a71f, 0x48322076010e5d51, 0xfb575855b26b2572, 0x692fa21b2013df3c,
        0x9871dee2d14da3c5, 0xa0924ac4335598b, 0xb96c5c8ff05021a8, 0x2b14a6c16228dbe6,
        0x7d3deb4334019664, 0xef45110da6796c2a, 0x5c20692e151c1409, 0xce5893608764ee47,
        0x3f06ef99763a92be, 0xad7e15d7e44268f0, 0x1e1b6df4572710d3, 0x8c6397bac55fea9d,
        0xf94be2f7b0779fd0, 0x6b3318b9220f659e, 0xd856609a916a1dbd, 0x4a2e9ad40312e7f3,
        0xbb70e62df24c9b0a, 0x29081c6360346144, 0x9a6d6440d3511967, 0x8159e0e4129e329,
        0x703d8eda3901f3fd, 0xe2457494ab7909b3, 0x51200cb7181c7190, 0xc358f6f98a648bde,
        0x32068a007b3af727, 0xa07e704ee9420d69, 0x131b086d5a27754a, 0x8163f223c85f8f04,
        0xf44b876ebd77fa49, 0x66337d202f0f0007, 0xd55605039c6a7824, 0x472eff4d0e12826a,
        0xb67083b4ff4cfe93, 0x240879fa6d3404dd, 0x976d01d9de517cfe, 0x515fb974c2986b0,
        0x673d20712e015d56, 0xf545da3fbc79a718, 0x4620a21c0f1cdf3b, 0xd45858529d642575,
        0x250624ab6c3a598c, 0xb77edee5fe42a3c2, 0x41ba6c64d27dbe1, 0x96635c88df5f21af,
        0xe34b29c5aa7754e2, 0x7133d38b380faeac, 0xc256aba88b6ad68f, 0x502e51e619122cc1,
        0xa1702d1fe84c5038, 0x3308d7517a34aa76, 0x806daf72c951d255, 0x1215553c5b29281b,
        0x6a3d45e8230138cf, 0xf845bfa6b179c281, 0x4b20c785021cbaa2, 0xd9583dcb906440ec,
        0x28064132613a3c15, 0xba7ebb7cf342c65b, 0x91bc35f4027be78, 0x9b633911d25f4436,
        0xee4b4c5ca777317b, 0x7c33b612350fcb35, 0xcf56ce31866ab316, 0x5d2e347f14124958,
        0xac704886e54c35a1, 0x3e08b2c87734cfef, 0x8d6dcaebc451b7cc, 0x1f1530a556294d82,
        0xf43ed64800000000, 0x19af0c29ed91da61, 0x2af1147bdecfc233, 0xc760ce1a335e1852,
        0x4c4d24dfb873f297, 0xa1dcfebe55e228f6, 0x9282e6ec66bc30a4, 0x7f133c8d8b2deac5,
        0x81354597750b93df, 0x6ca49ff6989a49be, 0x5ffa87a4abc451ec, 0xb26b5dc546558b8d,
        0x3946b700cd786148, 0xd4d76d6120e9bb29, 0xe789753313b7a37b, 0xa18af52fe26791a,
        0x1e29f1f6ea1727be, 0xf3b82b970786fddf, 0xc0e633c534d8e58d, 0x2d77e9a4d9493fec,
        0xa65a03615264d529, 0x4bcbd900bff50f48, 0x7895c1528cab171a, 0x95041b33613acd7b,
        0x6b2262299f1cb461, 0x86b3b848728d6e00, 0xb5eda01a41d37652, 0x587c7a7bac42ac33,
        0xd35190be276f46f6, 0x3ec04adfcafe9c97, 0xd9e528df9a084c5, 0xe00f88ec14315ea4,
        0x25fcefc5d1c2398d, 0xc86d35a43c53e3ec, 0xfb332df60f0dfbbe, 0x16a2f797e29c21df,
        0x9d8f1d5269b1cb1a, 0x701ec7338420117b, 0x4340df61b77e0929, 0xaed105005aefd348,
        0x50f77c1aa4c9aa52, 0xbd66a67b49587033, 0x8e38be297a066861, 0x63a964489797b200,
        0xe8848e8d1cba58c5, 0x51554ecf12b82a4, 0x364b4cbec2759af6, 0xdbda96df2fe44097,
        0xcfebc87b3bd51e33, 0x227a121ad644c452, 0x11240a48e51adc00, 0xfcb5d029088b0661,
        0x77983aec83a6eca4, 0x9a09e08d6e3736c5, 0xa957f8df5d692e97, 0x44c622beb0f8f4f6,
        0xbae05ba44ede8dec, 0x577181c5a34f578d, 0x642f999790114fdf, 0x89be43f67d8095be,
        0x293a933f6ad7f7b, 0xef0273521b3ca51a, 0xdc5c6b002862bd48, 0x31cdb161c5f36729,
        0x5256d3a3a66805eb, 0xbfc709c24bf9df8a, 0x8c99119078a7c7d8, 0x6108cbf195361db9,
        0xea2521341e1bf77c, 0x7b4fb55f38a2d1d, 0x34eae307c0d4354f, 0xd97b39662d45ef2e,
        0x275d407cd3639634, 0xcacc9a1d3ef24c55, 0xf992824f0dac5407, 0x1403582ee03d8e66,
        0x9f2eb2eb6b1064a3, 0x72bf688a8681bec2, 0x41e170d8b5dfa690, 0xac70aab9584e7cf1,
        0xb841f41d4c7f2255, 0x55d02e7ca1eef834, 0x668e362e92b0e066, 0x8b1fec4f7f213a07,
        0x32068af40cd0c2, 0xeda3dceb199d0aa3, 0xdefdc4b92ac312f1, 0x336c1ed8c752c890,
        0xcd4a67c23974b18a, 0x20dbbda3d4e56beb, 0x1385a5f1e7bb73b9, 0xfe147f900a2aa9d8,
        0x753995558107431d, 0x98a84f346c96997c, 0xabf657665fc8812e, 0x46678d07b2595b4f,
        0x8394ea2e77aa3c66, 0x6e05304f9a3be607, 0x5d5b281da965fe55, 0xb0caf27c44f42434,
        0x3be718b9cfd9cef1, 0xd676c2d822481490, 0xe528da8a11160cc2, 0x8b900ebfc87d6a3,
        0xf69f79f102a1afb9, 0x1b0ea390ef3075d8, 0x2850bbc2dc6e6d8a, 0xc5c161a331ffb7eb,
        0x4eec8b66bad25d2e, 0xa37d51075743874f, 0x90234955641d9f1d, 0x7db29334898c457c,
        0x6983cd909dbd1bd8, 0x841217f1702cc1b9, 0xb74c0fa34372d9eb, 0x5addd5c2aee3038a,
        0xd1f03f0725cee94f, 0x3c61e566c85f332e, 0xf3ffd34fb012b7c, 0xe2ae27551690f11d,
        0x1c885e4fe8b68807, 0xf119842e05275266, 0xc2479c7c36794a34, 0x2fd6461ddbe89055,
        0xa4fbacd850c57a90, 0x496a76b9bd54a0f1, 0x7a346eeb8e0ab8a3, 0x97a5b48a639b62c2,
        0xcb567ba500000000, 0x5816fa1e934081bb, 0xe83b0e22236d7587, 0x7b7b8f99b02df43c,
        0x8d8c90ab46daeb0e, 0x1ecc1110d59a6ab5, 0xaee1e52c65b79e89, 0x3da16497f6f71f32,
        0x46e3adb98db5d61c, 0xd5a32c021ef557a7, 0x658ed83eaed8a39b, 0xf6ce59853d982220,
        0x3946b7cb6f3d12, 0x9379c70c582fbca9, 0x23543330e8024895, 0xb014b28b7b42c92e,
        0xd5d1a16c1e87dac9, 0x469120d78dc75b72, 0xf6bcd4eb3deaaf4e, 0x65fc5550aeaa2ef5,
        0x930b4a62585d31c7, 0x4bcbd9cb1db07c, 0xb0663fe57b304440, 0x2326be5ee870c5fb,
        0x5864777093320cd5, 0xcb24f6cb00728d6e, 0x7b0902f7b05f7952, 0xe849834c231ff8e9,
        0x1ebe9c7ed5e8e7db, 0x8dfe1dc546a86660, 0x3dd3e9f9f685925c, 0xae93684265c513e7,
        0xf659ce373d0fb592, 0x65194f8cae4f3429, 0xd534bbb01e62c015, 0x46743a0b8d2241ae,
        0xb08325397bd55e9c, 0x23c3a482e895df27, 0x93ee50be58b82b1b, 0xaed105cbf8aaa0,
        0x7bec182bb0ba638e, 0xe8ac999023fae235, 0x58816dac93d71609, 0xcbc1ec17009797b2,
        0x3d36f325f6608880, 0xae76729e6520093b, 0x1e5b86a2d50dfd07, 0x8d1b0719464d7cbc,
        0xe8de14fe23886f5b, 0x7b9e9545b0c8eee0, 0xcbb3617900e51adc, 0x58f3e0c293a59b67,
        0xae04fff065528455, 0x3d447e4bf61205ee, 0x8d698a77463ff1d2, 0x1e290bccd57f7069,
        0x656bc2e2ae3db947, 0xf62b43593d7d38fc, 0x4606b7658d50ccc0, 0xd54636de1e104d7b,
        0x23b129ece8e75249, 0xb0f1a8577ba7d3f2, 0xdc5c6bcb8a27ce, 0x939cddd058caa675,
        0xb14910817a1f6b24, 0x2209913ae95fea9f, 0x9224650659721ea3, 0x164e4bdca329f18,
        0xf793fb8f3cc5802a, 0x64d37a34af850191, 0xd4fe8e081fa8f5ad, 0x47be0fb38ce87416,
        0x3cfcc69df7aabd38, 0xafbc472664ea3c83, 0x1f91b31ad4c7c8bf, 0x8cd132a147874904,
        0x7a262d93b1705636, 0xe966ac282230d78d, 0x594b5814921d23b1, 0xca0bd9af015da20a,
        0xafceca486498b1ed, 0x3c8e4bf3f7d83056, 0x8ca3bfcf47f5c46a, 0x1fe33e74d4b545d1,
        0xe914214622425ae3, 0x7a54a0fdb102db58, 0xca7954c1012f2f64, 0x5939d57a926faedf,
        0x227b1c54e92d67f1, 0xb13b9def7a6de64a, 0x11669d3ca401276, 0x9256e868590093cd,
        0x64a1f75aaff78cff, 0xf7e176e13cb70d44, 0x47cc82dd8c9af978, 0xd48c03661fda78c3,
        0x8c46a5134710deb6, 0x1f0624a8d4505f0d, 0xaf2bd094647dab31, 0x3c6b512ff73d2a8a,
        0xca9c4e1d01ca35b8, 0x59dccfa6928ab403, 0xe9f13b9a22a7403f, 0x7ab1ba21b1e7c184,
        0x1f3730fcaa508aa, 0x92b3f2b459e58911, 0x229e0688e9c87d2d, 0xb1de87337a88fc96,
        0x472998018c7fe3a4, 0xd46919ba1f3f621f, 0x6444ed86af129623, 0xf7046c3d3c521798,
        0x92c17fda5997047f, 0x181fe61cad785c4, 0xb1ac0a5d7afa71f8, 0x22ec8be6e9baf043,
        0xd41b94d41f4def71, 0x475b156f8c0d6eca, 0xf776e1533c209af6, 0x643660e8af601b4d,
        0x1f74a9c6d422d263, 0x8c34287d476253d8, 0x3c19dc41f74fa7e4, 0xaf595dfa640f265f,
        0x59ae42c892f8396d, 0xcaeec37301b8b8d6, 0x7ac3374fb1954cea, 0xe983b6f422d5cd51,
        0x9771f7c100000000, 0xbc7e6eb22b0f9973, 0xc16ec527561f32e6, 0xea615c547d10ab95,
        0x3b4f920dac3e65cc, 0x10400b7e8731fcbf, 0x6d50a0ebfa21572a, 0x465f3998d12ece59,
        0xcae14aa85d90bd69, 0xe1eed3db769f241a, 0x9cfe784e0b8f8f8f, 0xb7f1e13d208016fc,
        0x66df2f64f1aed8a5, 0x4dd0b617daa141d6, 0x30c01d82a7b1ea43, 0x1bcf84f18cbe7330,
        0x2c508d13bb217ad2, 0x75f1460902ee3a1, 0x7a4fbff5ed3e4834, 0x51402686c631d147,
        0x806ee8df171f1f1e, 0xab6171ac3c10866d, 0xd671da3941002df8, 0xfd7e434a6a0fb48b,
        0x71c0307ae6b1c7bb, 0x5acfa909cdbe5ec8, 0x27df029cb0aef55d, 0xcd09bef9ba16c2e,
        0xddfe55b64a8fa277, 0xf6f1ccc561803b04, 0x8be167501c909091, 0xa0eefe23379f09e2,
        0xe4df749473ae8355, 0xcfd0ede758a11a26, 0xb2c0467225b1b1b3, 0x99cfdf010ebe28c0,
        0x48e11158df90e699, 0x63ee882bf49f7fea, 0x1efe23be898fd47f, 0x35f1bacda2804d0c,
        0xb94fc9fd2e3e3e3c, 0x9240508e0531a74f, 0xef50fb1b78210cda, 0xc45f6268532e95a9,
        0x1571ac3182005bf0, 0x3e7e3542a90fc283, 0x436e9ed7d41f6916, 0x686107a4ff10f065,
        0x5ffe0e46c88ff987, 0x74f19735e38060f4, 0x9e13ca09e90cb61, 0x22eea5d3b59f5212,
        0xf3c06b8a64b19c4b, 0xd8cff2f94fbe0538, 0xa5df596c32aeaead, 0x8ed0c01f19a137de,
        0x26eb32f951f44ee, 0x29612a5cbe10dd9d, 0x547181c9c3007608, 0x7f7e18bae80fef7b,
        0xae50d6e339212122, 0x855f4f90122eb851, 0xf84fe4056f3e13c4, 0xd3407d7644318ab7,
        0x702cf16be75d06aa, 0x5b236818cc529fd9, 0x2633c38db142344c, 0xd3c5afe9a4dad3f,
        0xdc1294a74b636366, 0xf71d0dd4606cfa15, 0x8a0da6411d7c5180, 0xa1023f323673c8f3,
        0x2dbc4c02bacdbbc3, 0x6b3d57191c222b0, 0x7ba37ee4ecd28925, 0x50ace797c7dd1056,
        0x818229ce16f3de0f, 0xaa8db0bd3dfc477c, 0xd79d1b2840ecece9, 0xfc92825b6be3759a,
        0xcb0d8bb95c7c7c78, 0xe00212ca7773e50b, 0x9d12b95f0a634e9e, 0xb61d202c216cd7ed,
        0x6733ee75f04219b4, 0x4c3c7706db4d80c7, 0x312cdc93a65d2b52, 0x1a2345e08d52b221,
        0x969d36d001ecc111, 0xbd92afa32ae35862, 0xc082043657f3f3f7, 0xeb8d9d457cfc6a84,
        0x3aa3531cadd2a4dd, 0x11acca6f86dd3dae, 0x6cbc61fafbcd963b, 0x47b3f889d0c20f48,
        0x382723e94f385ff, 0x288deb4dbffc1c8c, 0x559d40d8c2ecb719, 0x7e92d9abe9e32e6a,
        0xafbc17f238cde033, 0x84b38e8113c27940, 0xf9a325146ed2d2d5, 0xd2acbc6745dd4ba6,
        0x5e12cf57c9633896, 0x751d5624e26ca1e5, 0x80dfdb19f7c0a70, 0x230264c2b4739303,
        0xf22caa9b655d5d5a, 0xd92333e84e52c429, 0xa433987d33426fbc, 0x8f3c010e184df6cf,
        0xb8a308ec2fd2ff2d, 0x93ac919f04dd665e, 0xeebc3a0a79cdcdcb, 0xc5b3a37952c254b8,
        0x149d6d2083ec9ae1, 0x3f92f453a8e30392, 0x42825fc6d5f3a807, 0x698dc6b5fefc3174,
        0xe533b58572424244, 0xce3c2cf6594ddb37, 0xb32c8763245d70a2, 0x98231e100f52e9d1,
        0x490dd049de7c2788, 0x6202493af573befb, 0x1f12e2af8863156e, 0x341d7bdca36c8c1d,
        0x3171d43000000000, 0x53927c5062e3a860, 0xf4b684f0c5c750c0, 0x96552c90a724f8a0,
        0xbf1303418e62d771, 0xddf0ab21ec817f11, 0x7ad453814ba587b1, 0x1837fbe129462fd1,
        0x28580c231929d813, 0x4abba4437bca7073, 0xed9f5ce3dcee88d3, 0x8f7cf483be0d20b3,
        0xa63adb52974b0f62, 0xc4d97332f5a8a702, 0x63fd8b92528c5fa2, 0x11e23f2306ff7c2,
        0x32264163253b026, 0x61c1cc7650b01846, 0xc6e534d6f794e0e6, 0xa4069cb695774886,
        0x8d40b367bc316757, 0xefa31b07ded2cf37, 0x4887e3a779f63797, 0x2a644bc71b159ff7,
        0x1a0bbc052b7a6835, 0x78e814654999c055, 0xdfccecc5eebd38f5, 0xbd2f44a58c5e9095,
        0x94696b74a518bf44, 0xf68ac314c7fb1724, 0x51ae3bb460dfef84, 0x334d93d4023c47e4,
        0x55d6b47c64a7604c, 0x37351c1c0644c82c, 0x9011e4bca160308c, 0xf2f24cdcc38398ec,
        0xdbb4630deac5b73d, 0xb957cb6d88261f5d, 0x1e7333cd2f02e7fd, 0x7c909bad4de14f9d,
        0x4cff6c6f7d8eb85f, 0x2e1cc40f1f6d103f, 0x89383cafb849e89f, 0xebdb94cfdaaa40ff,
        0xc29dbb1ef3ec6f2e, 0xa07e137e910fc74e, 0x75aebde362b3fee, 0x65b943be54c8978e,
        0x6785045a56f4d06a, 0x566ac3a3417780a, 0xa242549a933380aa, 0xc0a1fcfaf1d028ca,
        0xe9e7d32bd896071b, 0x8b047b4bba75af7b, 0x2c2083eb1d5157db, 0x4ec32b8b7fb2ffbb,
        0x7eacdc494fdd0879, 0x1c4f74292d3ea019, 0xbb6b8c898a1a58b9, 0xd98824e9e8f9f0d9,
        0xf0ce0b38c1bfdf08, 0x922da358a35c7768, 0x35095bf804788fc8, 0x57eaf398669b27a8,
        0xf83f14a8c94ec098, 0x9adcbcc8abad68f8, 0x3df844680c899058, 0x5f1bec086e6a3838,
        0x765dc3d9472c17e9, 0x14be6bb925cfbf89, 0xb39a931982eb4729, 0xd1793b79e008ef49,
        0xe116ccbbd067188b, 0x83f564dbb284b0eb, 0x24d19c7b15a0484b, 0x4632341b7743e02b,
        0x6f741bca5e05cffa, 0xd97b3aa3ce6679a, 0xaab34b0a9bc29f3a, 0xc850e36af921375a,
        0xca6ca48efb1d70be, 0xa88f0cee99fed8de, 0xfabf44e3eda207e, 0x6d485c2e5c39881e,
        0x440e73ff757fa7cf, 0x26eddb9f179c0faf, 0x81c9233fb0b8f70f, 0xe32a8b5fd25b5f6f,
        0xd3457c9de234a8ad, 0xb1a6d4fd80d700cd, 0x16822c5d27f3f86d, 0x7461843d4510500d,
        0x5d27abec6c567fdc, 0x3fc4038c0eb5d7bc, 0x98e0fb2ca9912f1c, 0xfa03534ccb72877c,
        0x9c9874e4ade9a0d4, 0xfe7bdc84cf0a08b4, 0x595f2424682ef014, 0x3bbc8c440acd5874,
        0x12faa395238b77a5, 0x70190bf54168dfc5, 0xd73df355e64c2765, 0xb5de5b3584af8f05,
        0x85b1acf7b4c078c7, 0xe7520497d623d0a7, 0x4076fc3771072807, 0x2295545713e48067,
        0xbd37b863aa2afb6, 0x6930d3e6584107d6, 0xce142b46ff65ff76, 0xacf783269d865716,
        0xaecbc4c29fba10f2, 0xcc286ca2fd59b892, 0x6b0c94025a7d4032, 0x9ef3c62389ee852,
        0x20a913b311d8c783, 0x424abbd3733b6fe3, 0xe56e4373d41f9743, 0x878deb13b6fc3f23,
        0xb7e21cd18693c8e1, 0xd501b4b1e4706081, 0x72254c1143549821, 0x10c6e47121b73041,
        0x3980cba008f11f90, 0x5b6363c06a12b7f0, 0xfc479b60cd364f50, 0x9ea43300afd5e730,
        0x30d2386500000000, 0x517648af61a470ca, 0xf39ad9f1c348e194, 0x923ea93ba2ec915e,
        0xb3af8dbc837db5d9, 0xd20bfd76e2d9c513, 0x70e76c284035544d, 0x11431ce221912487,
        0x33c5252603171d43, 0x526155ec62b36d89, 0xf08dc4b2c05ffcd7, 0x9129b478a1fb8c1d,
        0xb0b890ff806aa89a, 0xd11ce035e1ced850, 0x73f0716b4322490e, 0x125401a1228639c4,
        0x36fc02e3062e3a86, 0x57587229678a4a4c, 0xf5b4e377c566db12, 0x941093bda4c2abd8,
        0xb581b73a85538f5f, 0xd425c7f0e4f7ff95, 0x76c956ae461b6ecb, 0x176d266427bf1e01,
        0x35eb1fa0053927c5, 0x544f6f6a649d570f, 0xf6a3fe34c671c651, 0x97078efea7d5b69b,
        0xb696aa798644921c, 0xd732dab3e7e0e2d6, 0x75de4bed450c7388, 0x147a3b2724a80342,
        0x3c8e4d690c5c750c, 0x5d2a3da36df805c6, 0xffc6acfdcf149498, 0x9e62dc37aeb0e452,
        0xbff3f8b08f21c0d5, 0xde57887aee85b01f, 0x7cbb19244c692141, 0x1d1f69ee2dcd518b,
        0x3f99502a0f4b684f, 0x5e3d20e06eef1885, 0xfcd1b1becc0389db, 0x9d75c174ada7f911,
        0xbce4e5f38c36dd96, 0xdd409539ed92ad5c, 0x7fac04674f7e3c02, 0x1e0874ad2eda4cc8,
        0x3aa077ef0a724f8a, 0x5b0407256bd63f40, 0xf9e8967bc93aae1e, 0x984ce6b1a89eded4,
        0xb9ddc236890ffa53, 0xd879b2fce8ab8a99, 0x7a9523a24a471bc7, 0x1b3153682be36b0d,
        0x39b76aac096552c9, 0x58131a6668c12203, 0xfaff8b38ca2db35d, 0x9b5bfbf2ab89c397,
        0xbacadf758a18e710, 0xdb6eafbfebbc97da, 0x79823ee149500684, 0x18264e2b28f4764e,
        0x286ad27d18b8ea18, 0x49cea2b7791c9ad2, 0xeb2233e9dbf00b8c, 0x8a864323ba547b46,
        0xab1767a49bc55fc1, 0xcab3176efa612f0b, 0x685f8630588dbe55, 0x9fbf6fa3929ce9f,
        0x2b7dcf3e1baff75b, 0x4ad9bff47a0b8791, 0xe8352eaad8e716cf, 0x89915e60b9436605,
        0xa8007ae798d24282, 0xc9a40a2df9763248, 0x6b489b735b9aa316, 0xaecebb93a3ed3dc,
        0x2e44e8fb1e96d09e, 0x4fe098317f32a054, 0xed0c096fddde310a, 0x8ca879a5bc7a41c0,
        0xad395d229deb6547, 0xcc9d2de8fc4f158d, 0x6e71bcb65ea384d3, 0xfd5cc7c3f07f419,
        0x2d53f5b81d81cddd, 0x4cf785727c25bd17, 0xee1b142cdec92c49, 0x8fbf64e6bf6d5c83,
        0xae2e40619efc7804, 0xcf8a30abff5808ce, 0x6d66a1f55db49990, 0xcc2d13f3c10e95a,
        0x2436a77114e49f14, 0x4592d7bb7540efde, 0xe77e46e5d7ac7e80, 0x86da362fb6080e4a,
        0xa74b12a897992acd, 0xc6ef6262f63d5a07, 0x6403f33c54d1cb59, 0x5a783f63575bb93,
        0x2721ba3217f38257, 0x4685caf87657f29d, 0xe4695ba6d4bb63c3, 0x85cd2b6cb51f1309,
        0xa45c0feb948e378e, 0xc5f87f21f52a4744, 0x6714ee7f57c6d61a, 0x6b09eb53662a6d0,
        0x22189df712caa592, 0x43bced3d736ed558, 0xe1507c63d1824406, 0x80f40ca9b02634cc,
        0xa165282e91b7104b, 0xc0c158e4f0136081, 0x622dc9ba52fff1df, 0x389b970335b8115,
        0x210f80b411ddb8d1, 0x40abf07e7079c81b, 0xe2476120d2955945, 0x83e311eab331298f,
        0xa272356d92a00d08, 0xc3d645a7f3047dc2, 0x613ad4f951e8ec9c, 0x9ea433304c9c56,
        0x5407554600000000, 0xfc09ffcaa80eaa8c, 0x1f676af55f123e9, 0xa9f8dc23fdff8965,
        0xffe51294abe247d2, 0x57ebb81803eced5e, 0xaa14317dfe13643b, 0x21a9bf1561dceb7,
        0x62fac135228f955, 0xae21069ffa2653d9, 0x53de8ffa07d9dabc, 0xfbd02576afd77030,
        0xadcdebc1f9cabe87, 0x5c3414d51c4140b, 0xf83cc828ac3b9d6e, 0x503262a4043537e2,
        0xf056a7eca451f2aa, 0x58580d600c5f5826, 0xa5a78405f1a0d143, 0xda92e8959ae7bcf,
        0x5bb4e03e0fb3b578, 0xf3ba4ab2a7bd1ff4, 0xe45c3d75a429691, 0xa64b695bf24c3c1d,
        0xa27e5eb9f6790bff, 0xa70f4355e77a173, 0xf78f7d50a3882816, 0x5f81d7dc0b86829a,
        0x99c196b5d9b4c2d, 0xa192b3e7f595e6a1, 0x5c6d3a82086a6fc4, 0xf463900ea064c548,
        0x1948c6e34d4f93a5, 0xb1466c6fe5413929, 0x4cb9e50a18beb04c, 0xe4b74f86b0b01ac0,
        0xb2aa8131e6add477, 0x1aa42bbd4ea37efb, 0xe75ba2d8b35cf79e, 0x4f5508541b525d12,
        0x4b603fb61f676af0, 0xe36e953ab769c07c, 0x1e911c5f4a964919, 0xb69fb6d3e298e395,
        0xe0827864b4852d22, 0x488cd2e81c8b87ae, 0xb5735b8de1740ecb, 0x1d7df101497aa447,
        0xbd193449e91e610f, 0x15179ec54110cb83, 0xe8e817a0bcef42e6, 0x40e6bd2c14e1e86a,
        0x16fb739b42fc26dd, 0xbef5d917eaf28c51, 0x430a5072170d0534, 0xeb04fafebf03afb8,
        0xef31cd1cbb36985a, 0x473f6790133832d6, 0xbac0eef5eec7bbb3, 0x12ce447946c9113f,
        0x44d38ace10d4df88, 0xecdd2042b8da7504, 0x1122a9274525fc61, 0xb92c03abed2b56ed,
        0xce98720c9a9f274a, 0x6696d88032918dc6, 0x9b6951e5cf6e04a3, 0x3367fb696760ae2f,
        0x657a35de317d6098, 0xcd749f529973ca14, 0x308b1637648c4371, 0x9885bcbbcc82e9fd,
        0x9cb08b59c8b7de1f, 0x34be21d560b97493, 0xc941a8b09d46fdf6, 0x614f023c3548577a,
        0x3752cc8b635599cd, 0x9f5c6607cb5b3341, 0x62a3ef6236a4ba24, 0xcaad45ee9eaa10a8,
        0x6ac980a63eced5e0, 0xc2c72a2a96c07f6c, 0x3f38a34f6b3ff609, 0x973609c3c3315c85,
        0xc12bc774952c9232, 0x69256df83d2238be, 0x94dae49dc0ddb1db, 0x3cd44e1168d31b57,
        0x38e179f36ce62cb5, 0x90efd37fc4e88639, 0x6d105a1a39170f5c, 0xc51ef0969119a5d0,
        0x93033e21c7046b67, 0x3b0d94ad6f0ac1eb, 0xc6f21dc892f5488e, 0x6efcb7443afbe202,
        0x83d7e1a9d7d0b4ef, 0x2bd94b257fde1e63, 0xd626c24082219706, 0x7e2868cc2a2f3d8a,
        0x2835a67b7c32f33d, 0x803b0cf7d43c59b1, 0x7dc4859229c3d0d4, 0xd5ca2f1e81cd7a58,
        0xd1ff18fc85f84dba, 0x79f1b2702df6e736, 0x840e3b15d0096e53, 0x2c0091997807c4df,
        0x7a1d5f2e2e1a0a68, 0xd213f5a28614a0e4, 0x2fec7cc77beb2981, 0x87e2d64bd3e5830d,
        0x2786130373814645, 0x8f88b98fdb8fecc9, 0x727730ea267065ac, 0xda799a668e7ecf20,
        0x8c6454d1d8630197, 0x246afe5d706dab1b, 0xd99577388d92227e, 0x719bddb4259c88f2,
        0x75aeea5621a9bf10, 0xdda040da89a7159c, 0x205fc9bf74589cf9, 0x88516333dc563675,
        0xde4cad848a4bf8c2, 0x764207082245524e, 0x8bbd8e6ddfbadb2b, 0x23b324e177b471a7,
        0x678efd0100000000, 0xa8930703cf1dfa02, 0xfc597ff49bd782f5, 0x334485f654ca78f7,
        0x55cd8e1a3243731b, 0x9ad07418fd5e8919, 0xce1a0cefa994f1ee, 0x107f6ed66890bec,
        0x3081b376486e636, 0xcc15e135ab9b1c34, 0x98df99c2ff5164c3, 0x57c263c0304c9ec1,
        0x314b682c56c5952d, 0xfe56922e99d86f2f, 0xaa9cead9cd1217d8, 0x658110db020fedda,
        0xae83316dc90dcc6c, 0x619ecb6f0610366e, 0x3554b39852da4e99, 0xfa49499a9dc7b49b,
        0x9cc04276fb4ebf77, 0x53ddb87434534575, 0x717c08360993d82, 0xc80a3a81af84c780,
        0xca05d75bad8b2a5a, 0x5182d596296d058, 0x51d255ae365ca8af, 0x9ecfafacf94152ad,
        0xf846a4409fc85941, 0x375b5e4250d5a343, 0x639126b5041fdbb4, 0xac8cdcb7cb0221b6,
        0xf079132897f7ee29, 0x3f64e92a58ea142b, 0x6bae91dd0c206cdc, 0xa4b36bdfc33d96de,
        0xc23a6033a5b49d32, 0xd279a316aa96730, 0x59ede2c63e631fc7, 0x96f018c4f17ee5c5,
        0x94fff51ef371081f, 0x5be20f1c3c6cf21d, 0xf2877eb68a68aea, 0xc0358de9a7bb70e8,
        0xa6bc8605c1327b04, 0x69a17c070e2f8106, 0x3d6b04f05ae5f9f1, 0xf276fef295f803f3,
        0x3974df445efa2245, 0xf669254691e7d847, 0xa2a35db1c52da0b0, 0x6dbea7b30a305ab2,
        0xb37ac5f6cb9515e, 0xc42a565da3a4ab5c, 0x90e02eaaf76ed3ab, 0x5ffdd4a8387329a9,
        0x5df239723a7cc473, 0x92efc370f5613e71, 0xc625bb87a1ab4686, 0x93841856eb6bc84,
        0x6fb14a69083fb768, 0xa0acb06bc7224d6a, 0xf466c89c93e8359d, 0x3b7b329e5cf5cf9f,
        0x4d8d57a22a03aaa3, 0x8290ada0e51e50a1, 0xd65ad557b1d42856, 0x19472f557ec9d254,
        0x7fce24b91840d9b8, 0xb0d3debbd75d23ba, 0xe419a64c83975b4d, 0x2b045c4e4c8aa14f,
        0x290bb1944e854c95, 0xe6164b968198b697, 0xb2dc3361d552ce60, 0x7dc1c9631a4f3462,
        0x1b48c28f7cc63f8e, 0xd455388db3dbc58c, 0x809f407ae711bd7b, 0x4f82ba78280c4779,
        0x84809bcee30e66cf, 0x4b9d61cc2c139ccd, 0x1f57193b78d9e43a, 0xd04ae339b7c41e38,
        0xb6c3e8d5d14d15d4, 0x79de12d71e50efd6, 0x2d146a204a9a9721, 0xe209902285876d23,
        0xe0067df8878880f9, 0x2f1b87fa48957afb, 0x7bd1ff0d1c5f020c, 0xb4cc050fd342f80e,
        0xd2450ee3b5cbf3e2, 0x1d58f4e17ad609e0, 0x49928c162e1c7117, 0x868f7614e1018b15,
        0xda7ab98bbdf4448a, 0x1567438972e9be88, 0x41ad3b7e2623c67f, 0x8eb0c17ce93e3c7d,
        0xe839ca908fb73791, 0x2724309240aacd93, 0x73ee48651460b564, 0xbcf3b267db7d4f66,
        0xbefc5fbdd972a2bc, 0x71e1a5bf166f58be, 0x252bdd4842a52049, 0xea36274a8db8da4b,
        0x8cbf2ca6eb31d1a7, 0x43a2d6a4242c2ba5, 0x1768ae5370e65352, 0xd8755451bffba950,
        0x137775e774f988e6, 0xdc6a8fe5bbe472e4, 0x88a0f712ef2e0a13, 0x47bd0d102033f011,
        0x213406fc46bafbfd, 0xee29fcfe89a701ff, 0xbae38409dd6d7908, 0x75fe7e0b1270830a,
        0x77f193d1107f6ed0, 0xb8ec69d3df6294d2, 0xec2611248ba8ec25, 0x233beb2644b51627,
        0x45b2e0ca223c1dcb, 0x8aaf1ac8ed21e7c9, 0xde65623fb9eb9f3e, 0x1178983d76f6653c,
        0xf20c0dfe00000000, 0x13f860f3e1f46d0d, 0x3408a115c604aceb, 0xd5fccc1827f0c1e6,
        0x7be922d989e52f27, 0x9a1d4fd46811422a, 0xbded8e324fe183cc, 0x5c19e33fae15eec1,
        0xe42a2541162628bf, 0x5de484cf7d245b2, 0x222e89aad0228454, 0xc3dae4a731d6e959,
        0x6dcf0a669fc30798, 0x8c3b676b7e376a95, 0xabcba68d59c7ab73, 0x4a3fcb80b833c67e,
        0xde405c802c4c517e, 0x3fb4318dcdb83c73, 0x1844f06bea48fd95, 0xf9b09d660bbc9098,
        0x57a573a7a5a97e59, 0xb6511eaa445d1354, 0x91a1df4c63add2b2, 0x7055b2418259bfbf,
        0xc866743f3a6a79c1, 0x29921932db9e14cc, 0xe62d8d4fc6ed52a, 0xef96b5d91d9ab827,
        0x41835b18b38f56e6, 0xa0773615527b3beb, 0x8787f7f3758bfa0d, 0x66739afe947f9700,
        0xaa94af025898a2fc, 0x4b60c20fb96ccff1, 0x6c9003e99e9c0e17, 0x8d646ee47f68631a,
        0x23718025d17d8ddb, 0xc285ed283089e0d6, 0xe5752cce17792130, 0x48141c3f68d4c3d,
        0xbcb287bd4ebe8a43, 0x5d46eab0af4ae74e, 0x7ab62b5688ba26a8, 0x9b42465b694e4ba5,
        0x3557a89ac75ba564, 0xd4a3c59726afc869, 0xf3530471015f098f, 0x12a7697ce0ab6482,
        0x86d8fe7c74d4f382, 0x672c937195209e8f, 0x40dc5297b2d05f69, 0xa1283f9a53243264,
        0xf3dd15bfd31dca5, 0xeec9bc561cc5b1a8, 0xc9397db03b35704e, 0x28cd10bddac11d43,
        0x90fed6c362f2db3d, 0x710abbce8306b630, 0x56fa7a28a4f677d6, 0xb70e172545021adb,
        0x191bf9e4eb17f41a, 0xf8ef94e90ae39917, 0xdf1f550f2d1358f1, 0x3eeb3802cce735fc,
        0x433d4806b13145f8, 0xa2c9250b50c528f5, 0x8539e4ed7735e913, 0x64cd89e096c1841e,
        0xcad8672138d46adf, 0x2b2c0a2cd92007d2, 0xcdccbcafed0c634, 0xed28a6c71f24ab39,
        0x551b60b9a7176d47, 0xb4ef0db446e3004a, 0x931fcc526113c1ac, 0x72eba15f80e7aca1,
        0xdcfe4f9e2ef24260, 0x3d0a2293cf062f6d, 0x1afae375e8f6ee8b, 0xfb0e8e7809028386,
        0x6f7119789d7d1486, 0x8e8574757c89798b, 0xa975b5935b79b86d, 0x4881d89eba8dd560,
        0xe694365f14983ba1, 0x7605b52f56c56ac, 0x20909ab4d29c974a, 0xc164f7b93368fa47,
        0x795731c78b5b3c39, 0x98a35cca6aaf5134, 0xbf539d2c4d5f90d2, 0x5ea7f021acabfddf,
        0xf0b21ee002be131e, 0x114673ede34a7e13, 0x36b6b20bc4babff5, 0xd742df06254ed2f8,
        0x1ba5eafae9a9e704, 0xfa5187f7085d8a09, 0xdda146112fad4bef, 0x3c552b1cce5926e2,
        0x9240c5dd604cc823, 0x73b4a8d081b8a52e, 0x54446936a64864c8, 0xb5b0043b47bc09c5,
        0xd83c245ff8fcfbb, 0xec77af481e7ba2b6, 0xcb876eae398b6350, 0x2a7303a3d87f0e5d,
        0x8466ed62766ae09c, 0x6592806f979e8d91, 0x42624189b06e4c77, 0xa3962c84519a217a,
        0x37e9bb84c5e5b67a, 0xd61dd6892411db77, 0xf1ed176f03e11a91, 0x10197a62e215779c,
        0xbe0c94a34c00995d, 0x5ff8f9aeadf4f450, 0x780838488a0435b6, 0x99fc55456bf058bb,
        0x21cf933bd3c39ec5, 0xc03bfe363237f3c8, 0xe7cb3fd015c7322e, 0x63f52ddf4335f23,
        0xa82abc1c5a26b1e2, 0x49ded111bbd2dcef, 0x6e2e10f79c221d09, 0x8fda7dfa7dd67004,
    }
};

static union {
    uint32_t dword_table[4][256];
    uint64_t qword_array[512];
} long_shifts = {
    .qword_array = {
        0xe040e0ac00000000, 0x252d5705c56db7a9, 0x6f77f90f8f3719a3, 0xaa1a4ea64a5aae0a,
        0xfbc2a51b1b8245b7, 0x3eaf12b2deeff21e, 0x74f5bcb894b55c14, 0xb1980b1151d8ebbd,
        0xd7446bc237048b6e, 0x1229dc6bf2693cc7, 0x58737261b83392cd, 0x9d1ec5c87d5e2564,
        0xccc62e752c86ced9, 0x9ab99dce9eb7970, 0x43f137d6a3b1d77a, 0x869c807f66dc60d3,
        0x8e49f6706e0916dc, 0x4b2441d9ab64a175, 0x17eefd3e13e0f7f, 0xc413587a2453b8d6,
        0x95cbb3c7758b536b, 0x50a6046eb0e6e4c2, 0x1afcaa64fabc4ac8, 0xdf911dcd3fd1fd61,
        0xb94d7d1e590d9db2, 0x7c20cab79c602a1b, 0x367a64bdd63a8411, 0xf317d314135733b8,
        0xa2cf38a9428fd805, 0x67a28f0087e26fac, 0x2df8210acdb8c1a6, 0xe89596a308d5760f,
        0x3c52cd14dc122db8, 0xf93f7abd197f9a11, 0xb365d4b75325341b, 0x7608631e964883b2,
        0x27d088a3c790680f, 0xe2bd3f0a02fddfa6, 0xa8e7910048a771ac, 0x6d8a26a98dcac605,
        0xb56467aeb16a6d6, 0xce3bf1d32e7b117f, 0x84615fd96421bf75, 0x410ce870a14c08dc,
        0x10d403cdf094e361, 0xd5b9b46435f954c8, 0x9fe31a6e7fa3fac2, 0x5a8eadc7bace4d6b,
        0x525bdbc8b21b3b64, 0x97366c6177768ccd, 0xdd6cc26b3d2c22c7, 0x180175c2f841956e,
        0x49d99e7fa9997ed3, 0x8cb429d66cf4c97a, 0xc6ee87dc26ae6770, 0x3833075e3c3d0d9,
        0x655f50a6851fb00a, 0xa032e70f407207a3, 0xea6849050a28a9a9, 0x2f05feaccf451e00,
        0x7edd15119e9df5bd, 0xbbb0a2b85bf04214, 0xf1ea0cb211aaec1e, 0x3487bb1bd4c75bb7,
        0x5d88cd2dbdc82d81, 0x98e57a8478a59a28, 0xd2bfd48e32ff3422, 0x17d26327f792838b,
        0x460a889aa64a6836, 0x83673f336327df9f, 0xc93d9139297d7195, 0xc502690ec10c63c,
        0x6a8c46438acca6ef, 0xafe1f1ea4fa11146, 0xe5bb5fe005fbbf4c, 0x20d6e849c09608e5,
        0x710e03f4914ee358, 0xb463b45d542354f1, 0xfe391a571e79fafb, 0x3b54adfedb144d52,
        0x3381dbf1d3c13b5d, 0xf6ec6c5816ac8cf4, 0xbcb6c2525cf622fe, 0x79db75fb999b9557,
        0x28039e46c8437eea, 0xed6e29ef0d2ec943, 0xa73487e547746749, 0x6259304c8219d0e0,
        0x485509fe4c5b033, 0xc1e8e73621a8079a, 0x8bb2493c6bf2a990, 0x4edffe95ae9f1e39,
        0x1f071528ff47f584, 0xda6aa2813a2a422d, 0x90300c8b7070ec27, 0x555dbb22b51d5b8e,
        0x819ae09561da0039, 0x44f7573ca4b7b790, 0xeadf936eeed199a, 0xcbc04e9f2b80ae33,
        0x9a18a5227a58458e, 0x5f75128bbf35f227, 0x152fbc81f56f5c2d, 0xd0420b283002eb84,
        0xb69e6bfb56de8b57, 0x73f3dc5293b33cfe, 0x39a97258d9e992f4, 0xfcc4c5f11c84255d,
        0xad1c2e4c4d5ccee0, 0x687199e588317949, 0x222b37efc26bd743, 0xe7468046070660ea,
        0xef93f6490fd316e5, 0x2afe41e0cabea14c, 0x60a4efea80e40f46, 0xa5c958434589b8ef,
        0xf411b3fe14515352, 0x317c0457d13ce4fb, 0x7b26aa5d9b664af1, 0xbe4b1df45e0bfd58,
        0xd8977d2738d79d8b, 0x1dfaca8efdba2a22, 0x57a06484b7e08428, 0x92cdd32d728d3381,
        0xc31538902355d83c, 0x6788f39e6386f95, 0x4c222133ac62c19f, 0x894f969a690f7636,
        0x7e7c2df300000000, 0x82847615fcf85be6, 0x8260eccefc1cc13d, 0x7e98b72800e49adb,
        0x83a9d978fdd5f48b, 0x7f51829e012daf6d, 0x7fb5184501c935b6, 0x834d43a3fd316e50,
        0x803bb214fe479fe7, 0x7cc3e9f202bfc401, 0x7c277329025b5eda, 0x80df28cffea3053c,
        0x7dee469f03926b6c, 0x81161d79ff6a308a, 0x81f287a2ff8eaa51, 0x7d0adc440376f1b7,
        0x871f64ccf963493f, 0x7be73f2a059b12d9, 0x7b03a5f1057f8802, 0x87fbfe17f987d3e4,
        0x7aca904704b6bdb4, 0x8632cba1f84ee652, 0x86d6517af8aa7c89, 0x7a2e0a9c0452276f,
        0x7958fb2b0724d6d8, 0x85a0a0cdfbdc8d3e, 0x85443a16fb3817e5, 0x79bc61f007c04c03,
        0x848d0fa0faf12253, 0x78755446060979b5, 0x7891ce9d06ede36e, 0x8469957bfa15b888,
        0x8956c97cf72ae48f, 0x75ae929a0bd2bf69, 0x754a08410b3625b2, 0x89b253a7f7ce7e54,
        0x74833df70aff1004, 0x887b6611f6074be2, 0x889ffccaf6e3d139, 0x7467a72c0a1b8adf,
        0x7711569b096d7b68, 0x8be90d7df595208e, 0x8b0d97a6f571ba55, 0x77f5cc400989e1b3,
        0x8ac4a210f4b88fe3, 0x763cf9f60840d405, 0x76d8632d08a44ede, 0x8a2038cbf45c1538,
        0x703580430e49adb0, 0x8ccddba5f2b1f656, 0x8c29417ef2556c8d, 0x70d11a980ead376b,
        0x8de074c8f39c593b, 0x71182f2e0f6402dd, 0x71fcb5f50f809806, 0x8d04ee13f378c3e0,
        0x8e721fa4f00e3257, 0x728a44420cf669b1, 0x726ede990c12f36a, 0x8e96857ff0eaa88c,
        0x73a7eb2f0ddbc6dc, 0x8f5fb0c9f1239d3a, 0x8fbb2a12f1c707e1, 0x734371f40d3f5c07,
        0x95c5921cebb9bfef, 0x693dc9fa1741e409, 0x69d9532117a57ed2, 0x952108c7eb5d2534,
        0x68106697166c4b64, 0x94e83d71ea941082, 0x940ca7aaea708a59, 0x68f4fc4c1688d1bf,
        0x6b820dfb15fe2008, 0x977a561de9067bee, 0x979eccc6e9e2e135, 0x6b669720151abad3,
        0x9657f970e82bd483, 0x6aafa29614d38f65, 0x6a4b384d143715be, 0x96b363abe8cf4e58,
        0x6ca6db2312daf6d0, 0x905e80c5ee22ad36, 0x90ba1a1eeec637ed, 0x6c4241f8123e6c0b,
        0x91732fa8ef0f025b, 0x6d8b744e13f759bd, 0x6d6fee951313c366, 0x9197b573efeb9880,
        0x92e144c4ec9d6937, 0x6e191f22106532d1, 0x6efd85f91081a80a, 0x9205de1fec79f3ec,
        0x6f34b04f11489dbc, 0x93cceba9edb0c65a, 0x93287172ed545c81, 0x6fd02a9411ac0767,
        0x62ef76931c935b60, 0x9e172d75e06b0086, 0x9ef3b7aee08f9a5d, 0x620bec481c77c1bb,
        0x9f3a8218e146afeb, 0x63c2d9fe1dbef40d, 0x632643251d5a6ed6, 0x9fde18c3e1a23530,
        0x9ca8e974e2d4c487, 0x6050b2921e2c9f61, 0x60b428491ec805ba, 0x9c4c73afe2305e5c,
        0x617d1dff1f01300c, 0x9d854619e3f96bea, 0x9d61dcc2e31df131, 0x619987241fe5aad7,
        0x9b8c3face5f0125f, 0x6774644a190849b9, 0x6790fe9119ecd362, 0x9b68a577e5148884,
        0x6659cb271825e6d4, 0x9aa190c1e4ddbd32, 0x9a450a1ae43927e9, 0x66bd51fc18c17c0f,
        0x65cba04b1bb78db8, 0x9933fbade74fd65e, 0x99d76176e7ab4c85, 0x652f3a901b531763,
        0x981e54c0e6627933, 0x64e60f261a9a22d5, 0x640295fd1a7eb80e, 0x98face1be686e3e8,
        0xd29f092f00000000, 0x724d6d80a0d264af, 0x96d7b6804448bfaf, 0x3605d22fe49adb00,
        0x5a0e767188917f5e, 0xfadc12de28431bf1, 0x1e46c9deccd9c0f1, 0xbe94ad716c0ba45e,
        0xc651816214ce884d, 0x6683e5cdb41cece2, 0x82193ecd508637e2, 0x22cb5a62f054534d,
        0x4ec0fe3c9c5ff713, 0xee129a933c8d93bc, 0xa884193d81748bc, 0xaa5a253c78c52c13,
        0xfb0219b5299d109a, 0x5bd07d1a894f7435, 0xbf4aa61a6dd5af35, 0x1f98c2b5cd07cb9a,
        0x739366eba10c6fc4, 0xd341024401de0b6b, 0x37dbd944e544d06b, 0x9709bdeb4596b4c4,
        0xefcc91f83d5398d7, 0x4f1ef5579d81fc78, 0xab842e57791b2778, 0xb564af8d9c943d7,
        0x675deea6b5c2e789, 0xc78f8a0915108326, 0x23155109f18a5826, 0x83c735a651583c89,
        0x81a5281b533a2134, 0x21774cb4f3e8459b, 0xc5ed97b417729e9b, 0x653ff31bb7a0fa34,
        0x9345745dbab5e6a, 0xa9e633ea7b793ac5, 0x4d7ce8ea9fe3e1c5, 0xedae8c453f31856a,
        0x956ba05647f4a979, 0x35b9c4f9e726cdd6, 0xd1231ff903bc16d6, 0x71f17b56a36e7279,
        0x1dfadf08cf65d627, 0xbd28bba76fb7b288, 0x59b260a78b2d6988, 0xf96004082bff0d27,
        0xa83838817aa731ae, 0x8ea5c2eda755501, 0xec70872e3eef8e01, 0x4ca2e3819e3deaae,
        0x20a947dff2364ef0, 0x807b237052e42a5f, 0x64e1f870b67ef15f, 0xc4339cdf16ac95f0,
        0xbcf6b0cc6e69b9e3, 0x1c24d463cebbdd4c, 0xf8be0f632a21064c, 0x586c6bcc8af362e3,
        0x3467cf92e6f8c6bd, 0x94b5ab3d462aa212, 0x702f703da2b07912, 0xd0fd149202621dbd,
        0x74eb4b47a6744268, 0xd4392fe806a626c7, 0x30a3f4e8e23cfdc7, 0x9071904742ee9968,
        0xfc7a34192ee53d36, 0x5ca850b68e375999, 0xb8328bb66aad8299, 0x18e0ef19ca7fe636,
        0x6025c30ab2baca25, 0xc0f7a7a51268ae8a, 0x246d7ca5f6f2758a, 0x84bf180a56201125,
        0xe8b4bc543a2bb57b, 0x4866d8fb9af9d1d4, 0xacfc03fb7e630ad4, 0xc2e6754deb16e7b,
        0x5d765bdd8fe952f2, 0xfda43f722f3b365d, 0x193ee472cba1ed5d, 0xb9ec80dd6b7389f2,
        0xd5e7248307782dac, 0x7535402ca7aa4903, 0x91af9b2c43309203, 0x317dff83e3e2f6ac,
        0x49b8d3909b27dabf, 0xe96ab73f3bf5be10, 0xdf06c3fdf6f6510, 0xad2208907fbd01bf,
        0xc129acce13b6a5e1, 0x61fbc861b364c14e, 0x8561136157fe1a4e, 0x25b377cef72c7ee1,
        0x27d16a73f54e635c, 0x87030edc559c07f3, 0x6399d5dcb106dcf3, 0xc34bb17311d4b85c,
        0xaf40152d7ddf1c02, 0xf927182dd0d78ad, 0xeb08aa823997a3ad, 0x4bdace2d9945c702,
        0x331fe23ee180eb11, 0x93cd869141528fbe, 0x77575d91a5c854be, 0xd785393e051a3011,
        0xbb8e9d606911944f, 0x1b5cf9cfc9c3f0e0, 0xffc622cf2d592be0, 0x5f1446608d8b4f4f,
        0xe4c7ae9dcd373c6, 0xae9e1e467c011769, 0x4a04c546989bcc69, 0xead6a1e93849a8c6,
        0x86dd05b754420c98, 0x260f6118f4906837, 0xc295ba18100ab337, 0x6247deb7b0d8d798,
        0x1a82f2a4c81dfb8b, 0xba50960b68cf9f24, 0x5eca4d0b8c554424, 0xfe1829a42c87208b,
        0x92138dfa408c84d5, 0x32c1e955e05ee07a, 0xd65b325504c43b7a, 0x768956faa4165fd5,
        0x4904f22100000000, 0xdb0d16639209e442, 0x68fb4c5421ffbe75, 0xfaf2a816b3f65a37,
        0xafb8ecb43ff7cea, 0x98f26a89d1f698a8, 0x2b0430be6200c29f, 0xb90dd4fcf00926dd,
        0xcefa0bf587fef9d4, 0x5cf3efb715f71d96, 0xef05b580a60147a1, 0x7d0c51c23408a3e3,
        0x8d05771fc401853e, 0x1f0c935d5608617c, 0xacfac96ae5fe3b4b, 0x3ef32d2877f7df09,
        0x431577780a118559, 0xd11c933a9818611b, 0x62eac90d2bee3b2c, 0xf0e32d4fb9e7df6e,
        0xea0b9249eef9b3, 0x92e3efd0dbe71df1, 0x2115b5e7681147c6, 0xb31c51a5fa18a384,
        0xc4eb8eac8def7c8d, 0x56e26aee1fe698cf, 0xe51430d9ac10c2f8, 0x771dd49b3e1926ba,
        0x8714f246ce100067, 0x151d16045c19e425, 0xa6eb4c33efefbe12, 0x34e2a8717de65a50,
        0x5d27f89314230ab2, 0xcf2e1cd1862aeef0, 0x7cd846e635dcb4c7, 0xeed1a2a4a7d55085,
        0x1ed8847957dc7658, 0x8cd1603bc5d5921a, 0x3f273a0c7623c82d, 0xad2ede4ee42a2c6f,
        0xdad9014793ddf366, 0x48d0e50501d41724, 0xfb26bf32b2224d13, 0x692f5b70202ba951,
        0x99267dadd0228f8c, 0xb2f99ef422b6bce, 0xb8d9c3d8f1dd31f9, 0x2ad0279a63d4d5bb,
        0x57367dca1e328feb, 0xc53f99888c3b6ba9, 0x76c9c3bf3fcd319e, 0xe4c027fdadc4d5dc,
        0x14c901205dcdf301, 0x86c0e562cfc41743, 0x3536bf557c324d74, 0xa73f5b17ee3ba936,
        0xd0c8841e99cc763f, 0x42c1605c0bc5927d, 0xf1373a6bb833c84a, 0x633ede292a3a2c08,
        0x9337f8f4da330ad5, 0x13e1cb6483aee97, 0xb2c84681fbccb4a0, 0x20c1a2c369c550e2,
        0x6142e74528461564, 0xf34b0307ba4ff126, 0x40bd593009b9ab11, 0xd2b4bd729bb04f53,
        0x22bd9baf6bb9698e, 0xb0b47fedf9b08dcc, 0x34225da4a46d7fb, 0x914bc198d84f33b9,
        0xe6bc1e91afb8ecb0, 0x74b5fad33db108f2, 0xc743a0e48e4752c5, 0x554a44a61c4eb687,
        0xa543627bec47905a, 0x374a86397e4e7418, 0x84bcdc0ecdb82e2f, 0x16b5384c5fb1ca6d,
        0x6b53621c2257903d, 0xf95a865eb05e747f, 0x4aacdc6903a82e48, 0xd8a5382b91a1ca0a,
        0x28ac1ef661a8ecd7, 0xbaa5fab4f3a10895, 0x953a083405752a2, 0x9b5a44c1d25eb6e0,
        0xecad9bc8a5a969e9, 0x7ea47f8a37a08dab, 0xcd5225bd8456d79c, 0x5f5bc1ff165f33de,
        0xaf52e722e6561503, 0x3d5b0360745ff141, 0x8ead5957c7a9ab76, 0x1ca4bd1555a04f34,
        0x7561edf73c651fd6, 0xe76809b5ae6cfb94, 0x549e53821d9aa1a3, 0xc697b7c08f9345e1,
        0x369e911d7f9a633c, 0xa497755fed93877e, 0x17612f685e65dd49, 0x8568cb2acc6c390b,
        0xf29f1423bb9be602, 0x6096f06129920240, 0xd360aa569a645877, 0x41694e14086dbc35,
        0xb16068c9f8649ae8, 0x23698c8b6a6d7eaa, 0x909fd6bcd99b249d, 0x29632fe4b92c0df,
        0x7f7068ae36749a8f, 0xed798ceca47d7ecd, 0x5e8fd6db178b24fa, 0xcc8632998582c0b8,
        0x3c8f1444758be665, 0xae86f006e7820227, 0x1d70aa3154745810, 0x8f794e73c67dbc52,
        0xf88e917ab18a635b, 0x6a87753823838719, 0xd9712f0f9075dd2e, 0x4b78cb4d027c396c,
        0xbb71ed90f2751fb1, 0x297809d2607cfbf3, 0x9a8e53e5d38aa1c4, 0x887b7a741834586,
    }
};

static union {
    uint32_t dword_table[4][256];
    uint64_t qword_array[512];
} short_shifts = {
    .qword_array = {
        0xdcb17aa400000000, 0x603ff91dbc8e83b9, 0xa0400b277cf17183, 0x1cce889ec07ff23a,
        0x255399a2f9e2e306, 0x99dd1a1b456c60bf, 0x59a2e82185139285, 0xe52c6b98399d113c,
        0x2a98ca59f629b0fd, 0x961649e04aa73344, 0x5669bbda8ad8c17e, 0xeae73863365642c7,
        0xd37a295f0fcb53fb, 0x6ff4aae6b345d042, 0xaf8b58dc733a2278, 0x1305db65cfb4a1c1,
        0x350e6dafe9bf170b, 0x8980ee16553194b2, 0x49ff1c2c954e6688, 0xf5719f9529c0e531,
        0xccec8ea9105df40d, 0x70620d10acd377b4, 0xb01dff2a6cac858e, 0xc937c93d0220637,
        0xc327dd521f96a7f6, 0x7fa95eeba318244f, 0xbfd6acd16367d675, 0x3582f68dfe955cc,
        0x3ac53e54e67444f0, 0x864bbded5afac749, 0x46344fd79a853573, 0xfabacc6e260bb6ca,
        0xa232243d69258e7, 0xb6ada1fa6a1cdb5e, 0x76d253c0aa632964, 0xca5cd07916edaadd,
        0xf3c1c1452f70bbe1, 0x4f4f42fc93fe3858, 0x8f30b0c65381ca62, 0x33be337fef0f49db,
        0xfc0a92be20bbe81a, 0x408411079c356ba3, 0x80fbe33d5c4a9999, 0x3c756084e0c41a20,
        0x5e871b8d9590b1c, 0xb966f20165d788a5, 0x7919003ba5a87a9f, 0xc59783821926f926,
        0xe39c35483f2d4fec, 0x5f12b6f183a3cc55, 0x9f6d44cb43dc3e6f, 0x23e3c772ff52bdd6,
        0x1a7ed64ec6cfacea, 0xa6f055f77a412f53, 0x668fa7cdba3edd69, 0xda01247406b05ed0,
        0x15b585b5c904ff11, 0xa93b060c758a7ca8, 0x6944f436b5f58e92, 0xd5ca778f097b0d2b,
        0xec5766b330e61c17, 0x50d9e50a8c689fae, 0x90a617304c176d94, 0x2c289489f099ee2d,
        0x7479bd9ba8c8c73f, 0xc8f73e2214464486, 0x888cc18d439b6bc, 0xb4064fa168b73505,
        0x8d9b5e9d512a2439, 0x3115dd24eda4a780, 0xf16a2f1e2ddb55ba, 0x4de4aca79155d603,
        0x82500d665ee177c2, 0x3ede8edfe26ff47b, 0xfea17ce522100641, 0x422fff5c9e9e85f8,
        0x7bb2ee60a70394c4, 0xc73c6dd91b8d177d, 0x7439fe3dbf2e547, 0xbbcd1c5a677c66fe,
        0x9dc6aa904177d034, 0x21482929fdf9538d, 0xe137db133d86a1b7, 0x5db958aa8108220e,
        0x64244996b8953332, 0xd8aaca2f041bb08b, 0x18d53815c46442b1, 0xa45bbbac78eac108,
        0x6bef1a6db75e60c9, 0xd76199d40bd0e370, 0x171e6beecbaf114a, 0xab90e857772192f3,
        0x920df96b4ebc83cf, 0x2e837ad2f2320076, 0xeefc88e8324df24c, 0x52720b518ec371f5,
        0xa2ebe57c7e5a9fd8, 0x1e6566c5c2d41c61, 0xde1a94ff02abee5b, 0x62941746be256de2,
        0x5b09067a87b87cde, 0xe78785c33b36ff67, 0x27f877f9fb490d5d, 0x9b76f44047c78ee4,
        0x54c2558188732f25, 0xe84cd63834fdac9c, 0x28332402f4825ea6, 0x94bda7bb480cdd1f,
        0xad20b6877191cc23, 0x11ae353ecd1f4f9a, 0xd1d1c7040d60bda0, 0x6d5f44bdb1ee3e19,
        0x4b54f27797e588d3, 0xf7da71ce2b6b0b6a, 0x37a583f4eb14f950, 0x8b2b004d579a7ae9,
        0xb2b611716e076bd5, 0xe3892c8d289e86c, 0xce4760f212f61a56, 0x72c9e34bae7899ef,
        0xbd7d428a61cc382e, 0x1f3c133dd42bb97, 0xc18c33091d3d49ad, 0x7d02b0b0a1b3ca14,
        0x449fa18c982edb28, 0xf811223524a05891, 0x386ed00fe4dfaaab, 0x84e053b658512912,
        0x547df88f00000000, 0xfc860991a8fbf11e, 0x666c42541b94cd, 0xa89d9d5cfce065d3,
        0xfc4ad115a837299a, 0x54b1200b00ccd884, 0xa85145d8fc2cbd57, 0xaab4c654d74c49,
        0x1ffdd4a558225c5, 0xa9042c54fd79d4db, 0x55e449870199b108, 0xfd1fb899a9624016,
        0xa9c8f4d0fdb50c5f, 0x13305ce554efd41, 0xfdd3601da9ae9892, 0x552891030155698c,
        0xff79b305ab044b8a, 0x5782421b03ffba94, 0xab6227c8ff1fdf47, 0x399d6d657e42e59,
        0x574e9a9f03336210, 0xffb56b81abc8930e, 0x3550e525728f6dd, 0xabaeff4cffd307c3,
        0xaafb96c0fe866e4f, 0x20067de567d9f51, 0xfee0020daa9dfa82, 0x561bf31302660b9c,
        0x2ccbf5a56b147d5, 0xaa374e44fe4ab6cb, 0x56d72b9702aad318, 0xfe2cda89aa512206,
        0x799196a53e4e1e5, 0xaf62e874fb1f10fb, 0x53828da707ff7528, 0xfb797cb9af048436,
        0xafae30f0fbd3c87f, 0x755c1ee53283961, 0xfbb5a43dafc85cb2, 0x534e55230733adac,
        0x521b3caf0666c420, 0xfae0cdb1ae9d353e, 0x600a862527d50ed, 0xaefb597cfa86a1f3,
        0xfa2c1535ae51edba, 0x52d7e42b06aa1ca4, 0xae3781f8fa4a7977, 0x6cc70e652b18869,
        0xac9d52e0f8e0aa6f, 0x466a3fe501b5b71, 0xf886c62dacfb3ea2, 0x507d37330400cfbc,
        0x4aa7b7a50d783f5, 0xac518a64f82c72eb, 0x50b1efb704cc1738, 0xf84a1ea9ac37e626,
        0xf91f7725ad628faa, 0x51e4863b05997eb4, 0xad04e3e8f9791b67, 0x5ff12f65182ea79,
        0x51285ebf0555a630, 0xf9d3afa1adae572e, 0x533ca72514e32fd, 0xadc83b6cf9b5c3e3,
        0xf3b43b45a7c9c3ca, 0x5b4fca5b0f3232d4, 0xa7afaf88f3d25707, 0xf545e965b29a619,
        0x5b8312df0ffeea50, 0xf378e3c1a7051b4e, 0xf9886125be57e9d, 0xa763770cf31e8f83,
        0xa6361e80f24be60f, 0xecdef9e5ab01711, 0xf22d8a4da65072c2, 0x5ad67b530eab83dc,
        0xe01371a5a7ccf95, 0xa6fac604f2873e8b, 0x5a1aa3d70e675b58, 0xf2e152c9a69caa46,
        0x58b070cf0ccd8840, 0xf04b81d1a436795e, 0xcabe40258d61c8d, 0xa450151cf02ded93,
        0xf0875955a4faa1da, 0x587ca84b0c0150c4, 0xa49ccd98f0e13517, 0xc673c86581ac409,
        0xd32550a594fad85, 0xa5c9a414f1b45c9b, 0x5929c1c70d543948, 0xf1d230d9a5afc856,
        0xa5057c90f178841f, 0xdfe8d8e59837501, 0xf11ee85da56310d2, 0x59e519430d98e1cc,
        0xa050daa0f42d222f, 0x8ab2bbe5cd6d331, 0xf44b4e6da036b6e2, 0x5cb0bf7308cd47fc,
        0x867f33a5c1a0bb5, 0xa09c0224f4e1faab, 0x5c7c67f708019f78, 0xf48796e9a0fa6e66,
        0xf5d2ff65a1af07ea, 0x5d290e7b0954f6f4, 0xa1c96ba8f5b49327, 0x9329ab65d4f6239,
        0x5de5d6ff09982e70, 0xf51e27e1a163df6e, 0x9fe42325d83babd, 0xa105b32cf5784ba3,
        0xb54912a5f2969a5, 0xa3af6034f7d298bb, 0x5f4f05e70b32fd68, 0xf7b4f4f9a3c90c76,
        0xa363b8b0f71e403f, 0xb9849ae5fe5b121, 0xf7782c7da305d4f2, 0x5f83dd630bfe25ec,
        0x5ed6b4ef0aab4c60, 0xf62d45f1a250bd7e, 0xacd20225eb0d8ad, 0xa236d13cf64b29b3,
        0xf6e19d75a29c65fa, 0x5e1a6c6b0a6794e4, 0xa2fa09b8f687f137, 0xa01f8a65e7c0029,
        0x4a7ff16500000000, 0xde8013af94ffe2ca, 0x666c42002c13b365, 0xf293a0cab8ec51af,
        0x125897af582766ca, 0x86a77565ccd88400, 0x3e4b24ca7434d5af, 0xaab4c600e0cb3765,
        0xfa313cf1b04ecd94, 0x6ecede3b24b12f5e, 0xd6228f949c5d7ef1, 0x42dd6d5e08a29c3b,
        0xa2165a3be869ab5e, 0x36e9b8f17c964994, 0x8e05e95ec47a183b, 0x1afa0b945085faf1,
        0x2f0e1cbc6571edd9, 0xbbf1fe76f18e0f13, 0x31dafd949625ebc, 0x97e24d13dd9dbc76,
        0x77297a763d568b13, 0xe3d698bca9a969d9, 0x5b3ac91311453876, 0xcfc52bd985badabc,
        0x9f40d128d53f204d, 0xbbf33e241c0c287, 0xb353624df92c9328, 0x27ac80876dd371e2,
        0xc767b7e28d184687, 0x5398552819e7a44d, 0xeb740487a10bf5e2, 0x7f8be64d35f41728,
        0x809c2ad7cae3dbb2, 0x1463c81d5e1c3978, 0xac8f99b2e6f068d7, 0x38707b78720f8a1d,
        0xd8bb4c1d92c4bd78, 0x4c44aed7063b5fb2, 0xf4a8ff78bed70e1d, 0x60571db22a28ecd7,
        0x30d2e7437aad1626, 0xa42d0589ee52f4ec, 0x1cc1542656bea543, 0x883eb6ecc2414789,
        0x68f58189228a70ec, 0xfc0a6343b6759226, 0x44e632ec0e99c389, 0xd019d0269a662143,
        0xe5edc70eaf92366b, 0x711225c43b6dd4a1, 0xc9fe746b8381850e, 0x5d0196a1177e67c4,
        0xbdcaa1c4f7b550a1, 0x2935430e634ab26b, 0x91d912a1dba6e3c4, 0x526f06b4f59010e,
        0x55a30a9a1fdcfbff, 0xc15ce8508b231935, 0x79b0b9ff33cf489a, 0xed4f5b35a730aa50,
        0xd846c5047fb9d35, 0x997b8e9ad3047fff, 0x2197df356be82e50, 0xb5683dffff17cc9a,
        0xda5430f0902bc195, 0x4eabd23a04d4235f, 0xf6478395bc3872f0, 0x62b8615f28c7903a,
        0x8273563ac80ca75f, 0x168cb4f05cf34595, 0xae60e55fe41f143a, 0x3a9f079570e0f6f0,
        0x6a1afd6420650c01, 0xfee51faeb49aeecb, 0x46094e010c76bf64, 0xd2f6accb98895dae,
        0x323d9bae78426acb, 0xa6c27964ecbd8801, 0x1e2e28cb5451d9ae, 0x8ad1ca01c0ae3b64,
        0xbf25dd29f55a2c4c, 0x2bda3fe361a5ce86, 0x93366e4cd9499f29, 0x7c98c864db67de3,
        0xe702bbe3ad7d4a86, 0x73fd59293982a84c, 0xcb110886816ef9e3, 0x5feeea4c15911b29,
        0xf6b10bd4514e1d8, 0x9b94f277d1eb0312, 0x2378a3d8690752bd, 0xb7874112fdf8b077,
        0x574c76771d338712, 0xc3b394bd89cc65d8, 0x7b5fc51231203477, 0xefa027d8a5dfd6bd,
        0x10b7eb425ac81a27, 0x84480988ce37f8ed, 0x3ca4582776dba942, 0xa85bbaede2244b88,
        0x48908d8802ef7ced, 0xdc6f6f4296109e27, 0x64833eed2efccf88, 0xf07cdc27ba032d42,
        0xa0f926d6ea86d7b3, 0x3406c41c7e793579, 0x8cea95b3c69564d6, 0x18157779526a861c,
        0xf8de401cb2a1b179, 0x6c21a2d6265e53b3, 0xd4cdf3799eb2021c, 0x403211b30a4de0d6,
        0x75c6069b3fb9f7fe, 0xe139e451ab461534, 0x59d5b5fe13aa449b, 0xcd2a57348755a651,
        0x2de16051679e9134, 0xb91e829bf36173fe, 0x1f2d3344b8d2251, 0x950d31fedf72c09b,
        0xc588cb0f8ff73a6a, 0x517729c51b08d8a0, 0xe99b786aa3e4890f, 0x7d649aa0371b6bc5,
        0x9dafadc5d7d05ca0, 0x9504f0f432fbe6a, 0xb1bc1ea0fbc3efc5, 0x2543fc6a6f3c0d0f,
        0x25bbf5db00000000, 0x6ecc1e6d4b77ebb6, 0xb35422b796efd76c, 0xf823c901dd983cda,
        0xd882df22833d829, 0x46ffc6446344339f, 0x9b67fa9ebedc0f45, 0xd0101128f5abe4f3,
        0x75dc45895067b052, 0x3eabae3f1b105be4, 0xe33392e5c688673e, 0xa84479538dff8c88,
        0x5def9da07854687b, 0x16987616332383cd, 0xcb004acceebbbf17, 0x8077a17aa5cc54a1,
        0x8574957fa0cf60a4, 0xce037ec9ebb88b12, 0x139b42133620b7c8, 0x58eca9a57d575c7e,
        0xad474d5688fcb88d, 0xe630a6e0c38b533b, 0x3ba89a3a1e136fe1, 0x70df718c55648457,
        0xd513252df0a8d0f6, 0x9e64ce9bbbdf3b40, 0x43fcf2416647079a, 0x88b19f72d30ec2c,
        0xfd20fd04d89b08df, 0xb65716b293ece369, 0x6bcf2a684e74dfb3, 0x20b8c1de05033405,
        0x61c942624472b7b9, 0x2abea9d40f055c0f, 0xf726950ed29d60d5, 0xbc517eb899ea8b63,
        0x49fa9a4b6c416f90, 0x28d71fd27368426, 0xdf154d27faaeb8fc, 0x9462a691b1d9534a,
        0x31aef230141507eb, 0x7ad919865f62ec5d, 0xa741255c82fad087, 0xec36ceeac98d3b31,
        0x199d2a193c26dfc2, 0x52eac1af77513474, 0x8f72fd75aac908ae, 0xc40516c3e1bee318,
        0xc10622c6e4bdd71d, 0x8a71c970afca3cab, 0x57e9f5aa72520071, 0x1c9e1e1c3925ebc7,
        0xe935faefcc8e0f34, 0xa242115987f9e482, 0x7fda2d835a61d858, 0x34adc635111633ee,
        0x91619294b4da674f, 0xda167922ffad8cf9, 0x78e45f82235b023, 0x4cf9ae4e69425b95,
        0xb9524abd9ce9bf66, 0xf225a10bd79e54d0, 0x2fbd9dd10a06680a, 0x64ca7667417183bc,
        0xad5e9aa988e56f72, 0xe629711fc39284c4, 0x3bb14dc51e0ab81e, 0x70c6a673557d53a8,
        0x856d4280a0d6b75b, 0xce1aa936eba15ced, 0x138295ec36396037, 0x58f57e5a7d4e8b81,
        0xfd392afbd882df20, 0xb64ec14d93f53496, 0x6bd6fd974e6d084c, 0x20a11621051ae3fa,
        0xd50af2d2f0b10709, 0x9e7d1964bbc6ecbf, 0x43e525be665ed065, 0x892ce082d293bd3,
        0xd91fa0d282a0fd6, 0x46e611bb635de460, 0x9b7e2d61bec5d8ba, 0xd009c6d7f5b2330c,
        0x25a222240019d7ff, 0x6ed5c9924b6e3c49, 0xb34df54896f60093, 0xf83a1efedd81eb25,
        0x5df64a5f784dbf84, 0x1681a1e9333a5432, 0xcb199d33eea268e8, 0x806e7685a5d5835e,
        0x75c59276507e67ad, 0x3eb279c01b098c1b, 0xe32a451ac691b0c1, 0xa85daeac8de65b77,
        0xe92c2d10cc97d8cb, 0xa25bc6a687e0337d, 0x7fc3fa7c5a780fa7, 0x34b411ca110fe411,
        0xc11ff539e4a400e2, 0x8a681e8fafd3eb54, 0x57f02255724bd78e, 0x1c87c9e3393c3c38,
        0xb94b9d429cf06899, 0xf23c76f4d787832f, 0x2fa44a2e0a1fbff5, 0x64d3a19841685443,
        0x9178456bb4c3b0b0, 0xda0faeddffb45b06, 0x7979207222c67dc, 0x4ce079b1695b8c6a,
        0x49e34db46c58b86f, 0x294a602272f53d9, 0xdf0c9ad8fab76f03, 0x947b716eb1c084b5,
        0x61d0959d446b6046, 0x2aa77e2b0f1c8bf0, 0xf73f42f1d284b72a, 0xbc48a94799f35c9c,
        0x1984fde63c3f083d, 0x52f316507748e38b, 0x8f6b2a8aaad0df51, 0xc41cc13ce1a734e7,
        0x31b725cf140cd014, 0x7ac0ce795f7b3ba2, 0xa758f2a382e30778, 0xec2f1915c994ecce,
    }
};

/* Table-driven software version as a fall-back.  This is about 15 times slower
   than using the hardware instructions.  This assumes little-endian integers,
   as is the case on Intel processors that the assembler code here is for. */
uint32_t crc32c_append_sw(uint32_t crci, buffer input, size_t length)
{
    buffer next = input;
#ifdef _M_X64
    uint64_t crc;
#else
    uint32_t crc;
#endif

    crc = crci ^ 0xffffffff;
#ifdef _M_X64
    while (length && ((uintptr_t)next & 7) != 0)
    {
        crc = table.dword_table[0][(crc ^ *next++) & 0xff] ^ (crc >> 8);
        --length;
    }
    while (length >= 16)
    {
        crc ^= *(uint64_t *)next;
        uint64_t high = *(uint64_t *)(next + 8);
        crc = table.dword_table[15][crc & 0xff]
            ^ table.dword_table[14][(crc >> 8) & 0xff]
            ^ table.dword_table[13][(crc >> 16) & 0xff]
            ^ table.dword_table[12][(crc >> 24) & 0xff]
            ^ table.dword_table[11][(crc >> 32) & 0xff]
            ^ table.dword_table[10][(crc >> 40) & 0xff]
            ^ table.dword_table[9][(crc >> 48) & 0xff]
            ^ table.dword_table[8][crc >> 56]
            ^ table.dword_table[7][high & 0xff]
            ^ table.dword_table[6][(high >> 8) & 0xff]
            ^ table.dword_table[5][(high >> 16) & 0xff]
            ^ table.dword_table[4][(high >> 24) & 0xff]
            ^ table.dword_table[3][(high >> 32) & 0xff]
            ^ table.dword_table[2][(high >> 40) & 0xff]
            ^ table.dword_table[1][(high >> 48) & 0xff]
            ^ table.dword_table[0][high >> 56];
        next += 16;
        length -= 16;
    }
#else
    while (length && ((uintptr_t)next & 3) != 0)
    {
        crc = table.dword_table[0][(crc ^ *next++) & 0xff] ^ (crc >> 8);
        --length;
    }
    while (length >= 12)
    {
        crc ^= *(uint32_t *)next;
        uint32_t high = *(uint32_t *)(next + 4);
        uint32_t high2 = *(uint32_t *)(next + 8);
        crc = table.dword_table[11][crc & 0xff]
            ^ table.dword_table[10][(crc >> 8) & 0xff]
            ^ table.dword_table[9][(crc >> 16) & 0xff]
            ^ table.dword_table[8][crc >> 24]
            ^ table.dword_table[7][high & 0xff]
            ^ table.dword_table[6][(high >> 8) & 0xff]
            ^ table.dword_table[5][(high >> 16) & 0xff]
            ^ table.dword_table[4][high >> 24]
            ^ table.dword_table[3][high2 & 0xff]
            ^ table.dword_table[2][(high2 >> 8) & 0xff]
            ^ table.dword_table[1][(high2 >> 16) & 0xff]
            ^ table.dword_table[0][high2 >> 24];
        next += 12;
        length -= 12;
    }
#endif
    while (length)
    {
        crc = table.dword_table[0][(crc ^ *next++) & 0xff] ^ (crc >> 8);
        --length;
    }
    return (uint32_t)crc ^ 0xffffffff;
}

/* Apply the zeros operator table to crc. */
static inline uint32_t shift_crc(uint32_t shift_table[][256], uint32_t crc)
{
    return shift_table[0][crc & 0xff]
        ^ shift_table[1][(crc >> 8) & 0xff]
        ^ shift_table[2][(crc >> 16) & 0xff]
        ^ shift_table[3][crc >> 24];
}

uint32_t crc32c_append(uint32_t crc, buffer input, size_t length)
{
	return crc32c_append_sw(crc, input, length);
}
